안드로이드 (V30) selinux 정책 검사


12

selinux를 사용하여 휴대 전화에서 실제로 적용되는 정책을 찾으려고합니다. 당신은 이것이 쉬울 것이라고 생각할 것입니다. 결국 보안을 위해 정책이 기대와 일치하는지 확인하는 것이 좋습니다. 불행히도, A) 안드로이드가 포크 정책 버전 30을 사용하는 것처럼 보이고 B) 정책 툴 체인이 매우 낮은 품질의 빌드 프로세스 (많은 하드 코딩 된 경로 등)를 가지고 있기 때문에이 놀랍게도 어려운 일을 발견했습니다. ).

내가 시도한 두 가지가 작동하지 않았습니다. 상용 setools 도구 (예 : fedora 용 패키지로 제공되거나 아치 리눅스를 사용하여 AUR에서 설치할 수 있음)를 사용하려고하면 /sepolicy전화의 루트 디렉토리 또는 공장 이미지에서 가져온 후 다음을 얻습니다 .

$ sedispol sepolicy 
Reading policy...
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
sedispol:  error(s) encountered while parsing configuration
$ sesearch --all sepolicy 
ERROR: policydb version 30 does not match my version range 15-29
ERROR: Unable to open policy sepolicy.
ERROR: Success
$

좋아, 그래서 selinux 라이브러리의 안드로이드 버전을 만들어야한다고 제안한다. AOSP 소스 트리에는 사전 컴파일 된 일부 도구 버전이 포함되어 있지만, 내가 가지고 있지 않은 오래된 공유 라이브러리 (libpcre3 등)에 따라 다릅니다. 어쨌든 보안 정책을 확인하는 유일한 방법은 인터넷에서 가져온 바이너리 공유 라이브러리를 신뢰하는 것이라면 충격적입니다.

그래서 여기 안드로이드 selinux 라이브러리를 빌드하기 위해 한 일이 있습니다. 아치에서, ustr-selinuxustr inline이 이제 사용이 필요한 곳을 사용하기 때문에 AUR에서 설치 해야했습니다 static inline. 좋아, 지금까지는 좋아 불행히도 빌드 프로세스는 실제로 거칠지 만 다음과 같이 컴파일하고 설치할 수 있습니다.

git clone https://android.googlesource.com/platform/external/selinux \
    android/external/selinux
export ANDROID_BUILD_TOP=$PWD/android
DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
cd android/external/selinux
sed -ie '/^LDLIBS.*(LIBDIR)/s/$/ ..\/lex.yy.o/' checkpolicy/test/Makefile
make install DESTDIR="$DESTDIR" \
     PREFIX='$(DESTDIR)/usr' \
     CFLAGS='-I$(PREFIX)/include' \
     -j20 -k
cp checkpolicy/test/dispol "$DESTDIR/usr/sbin/sedispol"
cp checkpolicy/test/dismod "$DESTDIR/usr/sbin/sedismod"

이 시점에서 sedispol일반적인 SElinux 정책 ( policy.29페도라 의 버전 29와 같은 )을 작동하지만 여전히 안드로이드에서 무슨 일이 일어나고 있는지 보여주지 않습니다.

$ ~/android_selinux/usr/sbin/sedispol sepolicy 
Reading policy...
libsepol.avtab_read_item: more than one specifier
libsepol.avtab_read: failed on entry 457 of 5582
/home/user/android_selinux/usr/sbin/dispol:  error(s) encountered while parsing configuration
$ 

또한 setools3안드로이드 라이브러리에 대해 바닐라 도구를 컴파일하려고했습니다 . 다시 말하지만 너무 쉽지는 않지만 다음과 같이 작동합니다.

DESTDIR=$HOME/android_selinux
export LD_LIBRARY_PATH="$DESTDIR/lib:$DESTDIR/usr/lib"
git clone https://github.com/TresysTechnology/setools3.git
cd setools3
./configure --prefix=$DESTDIR/usr --with-sepol-devel=$DESTDIR/usr CPPFLAGS="-I$DESTDIR/usr/include -L$DESTDIR/usr/lib"
make -k -j20

이것은 완전히 빌드되지는 않지만 실행할 수있는 소스 트리를 충분히 빌드합니다 secmds/sesearch. 바닐라에 작품이 종류의 policy.29파일 (I는 검색 할 수 -A-T하지만, --all저를 준다 operation not supported). 그러나 안드로이드 버전 30 파일을 검사하려고 할 때 비슷한 오류로 완전히 실패합니다.

$ ./secmds/sesearch -A sepolicy 
ERROR: more than one specifier
ERROR: failed on entry 457 of 5582
ERROR: Unable to open policy sepolicy.
ERROR: Success
$ 

이 시점에서 제 마음은 시스템 보안 정책과 같이 매우 중요한 툴링이 실제로 구축하기가 어렵다는 것입니다. 분명히 나는 ​​뭔가 잘못하고 있어야합니다. 실제로 외부 분산 바이너리 공유 라이브러리에 의존하지 않고 안드로이드 보안 정책을 조사한 사람이 있습니까?

또한 사전 구축 된 모든 도구 ( ndk/build/tools/download-toolchain-sources.shndk/build/tools/rebuild-all-prebuilt.sh) 를 재 구축하기 위해 제안 된 기술을 사용해 보았습니다 . 그러나 download-toolchain-sources.sh스크립트는 현재 고장났습니다. 리포지토리에없는 이전 버전 디렉토리를 더 이상 확인하려고 시도하지만 selinux prebuilts/python관련 코드 가 포함되어 있음에도 불구하고 selinux 관련 도구를 다운로드하지 않는 것으로 보입니다 . 다시 한 번,이 빌드 시스템이 얼마나 무자비한 지에 대해 충격을 받았으며 더 쉬운 방법이 있어야한다고 생각합니다. 질문 내 안드로이드 selinux 정책을 확인할 수있는 도구를 어떻게 얻을 수 있습니까?

답변:


8

우선, 나는 "이 놀랍게도 어려운 일을 발견했습니다"라는 진술에 전적으로 동의 함을 인정해야합니다 . Google은 주로 고급 사용자가 아닌 소비자 관점에서 Android를 설계했습니다. 결과적으로 최신 Facebook 앱을 사용하거나 Candy Crush를 사용하는 것 이외의 작업을 수행하자마자 개발자와 같은 지식이 변경되어야하는 2000 년 초반 Linux 영역에서 매우 빠르게 자신을 발견 할 수 있습니다. 간단한 설정은 무엇입니까? 안드로이드 시스템이 성숙 해짐에 따라 상황이 빠르게 진화 할 것이라고 믿지만 지금은 우리가 가진 것과 관련이 있습니다.

당신이 말했듯이, 당신 자신의 SELinux 툴셋을 컴파일해야하는 두 가지 이유가 있습니다 :

  • 시스템 제공 툴셋은 일반적으로 뒤 버전입니다. Android의 SELinux는 정책 DB 버전 30을 사용하지만 현재 Linux 상자는 일반적으로 최대 29 개의 버전 만 처리합니다.
  • 최신 버전 이더라도 실제로는 업스트림 코드 에서 SELinux를 구축 하는 것이 좋습니다 (실제로는 업스트림 권장 사항을 따르는 Fedora 시스템에서 쉽게 수행 할 수 있음). 과도하게 수정 ( Google 문서 는 몇 가지 수정 사항을 강조 표시)하므로 구문 및 구문 분석 오류로 인해 Android SELinux를 처리하지 못했습니다.

따라서 안드로이드의 SELinux 분석 퀘스트를 유지하려면 가능한 가장 깨끗한 방법으로 흙에 손을 넣어야합니다.

  • 먼저 제정신 환경을 설정하겠습니다.
  • 이 작업이 끝나면 Android의 SELinux 라이브러리와 첫 번째 도구를 컴파일합니다.
  • 그 외에도 SELinux 도구를 구축하고
  • 몇 가지 보조 유틸리티를 추가하여 마무리합니다.

적절한 환경 설정

환경 속성

가장 깨끗하고 권장되는 방법은 아마도 확실하게 작동하는 방법은 Android 작업에 환경을 전념하는 것입니다.

  • 가상 머신은 완벽합니다 (최상의 옵션이 아닌 경우). USB를 통해 전화를 게스트 시스템에 연결해야하므로 VMware를 사용하는 것이 좋습니다. 무료 대안 Qemu는 그러한 작업을 잘 처리하지 못하는 것 같습니다. 다른 가상화 소프트웨어로는 시도하지 않았습니다.

  • 64 비트 시스템이어야합니다. 그렇지 않으면 정수의 크기가 잘못되어 코드가 컴파일되지 않습니다.

  • 되는 강력 우분투 시스템을 사용, 아마도 필수, 권장. XFCE의 더 가벼운 데스크탑 환경을 선호한다면 Xubuntu를 자유롭게 사용하십시오. 이것은 시스템의 핵심 및 사용 가능한 패키지를 변경하지 않으며 Android 관련 작업에 영향을 미치지 않습니다 (이 절차에서 Ubuntu에 대해 말한 것은 Xubuntu에도 적용됩니다). Android SELinux 소스 트리에서 Fedora를 사용하도록 권장하는 일부 ReadMe 파일을 찾을 수 있습니다.이 파일은 업스트림 NSA의 SELinux 프로젝트에서 상속되며 해당 컨텐츠가 Google의 Android와 반드시 일치하지는 않습니다.

  • 사용할 Unbuntu의 정확한 버전은 빌드하려는 Android 버전에 따라 다릅니다. Android 6.0의 경우 Ubuntu 14.04 (Trusty)가 권장됩니다. 확인 구글의 요구 사항 페이지를 자세한 내용은.

  • 충분한 디스크 공간이 필요합니다 (SELinux 관련 조사 만 계획하는 경우 50GB 이상, Android의 완전한 빌드를 계획하는 경우 100GB 이상). CPU와 메모리는 관련성이 적으며 전체 빌드 시간에만 영향을 미치며 SELinux 관련 작업에는 실제로 영향을 미치지 않습니다.

Ubuntu를 사용하면 두 가지 주요 이점이 있습니다.

  • 권장 시스템을 사용하면 잘 알려지고 잘 테스트 된 환경에서 작업 할 수 있습니다. 시스템 라이브러리, 도구 및 패키지는 프로젝트에 필요한 버전과 위치에 있습니다.

  • 그리고 더 구체적으로 우리의 경우 : 우분투 자체는 SELinux 대안 인 AppArmor에 의존하며 SELinux를 사용하지 않습니다. 좋은 소식은 시스템 안정성을 변경하지 않고도 시스템 전체에 Android SELinux 도구 및 바이너리를 설치할 수 있다는 것입니다.

환경 설치 절차

본격적인 라이브 DVD에서 시작하여 전통적인 방식으로 Ubuntu를 설치할 수 있지만 빠른 부팅 방법은 넷 부트 설치 (텍스트 모드 설치)를 사용하고 원하는 데스크탑 환경을 선택하는 것입니다. 이렇게하면 오래된 패키지를 먼저 설치하는 대신 최신 패키지 버전을 직접 설치 한 다음 첫 번째 부팅시 389 개의 보류중인 업데이트를 적용하도록 요청하여 초기 업데이트 시간을 절약 할 수 있습니다.

Ubuntu / Xubuntu 14.04 용 ISO (동일한 ISO) netboot 설치 프로그램은 여기에서 사용할 수 있습니다 .

VMware의 번거로운 "쉬운 설치"기능을 건너 뛰려면 "나중에 운영 체제를 설치합니다" 옵션 을 선택하여 시작하는 것이 좋습니다 .

게스트 OS로 Linux 를 선택한 다음 Ubuntu 64 비트 를 선택하십시오 .

VM에는 다음 리소스가 필요합니다.

  • 필수 : 디스크 공간은 40GB 이상 이어야합니다 (기본 20GB로는 충분 하지 않으며 소스 코드만으로는 그보다 더 많은 공간이 필요함). 더 높은 것이 권장됩니다. 전체 빌드에는 최소 100GB의 디스크가 필요합니다. 이것이 제가 일반적으로 취하는 가치입니다. 이 설정은 최대 한도라는 것을 잊지 마십시오. VM이 실제로 가져 오는 크기는 게스트의 요청에 따라 동적으로 커집니다.
  • 기능 : RAM을 1024에서 최소 2048 이상으로 늘리십시오 (호스트 용량에 따라 4096을 사용합니다),
  • 기능 : 프로세서 코어 수를 1에서 2 이상으로 늘리십시오 (호스트 용량에 따라 3을 사용함).
  • CD-Rom은 설치 ISO 파일을 가리켜 야합니다.
  • 장치를 연결할 때 전자 장치가 경고를 표시 할 수 있으므로 USB를 기본 1.1에서 2.0으로 전환 할 수 있습니다. 사용량에 따라 "새 USB 장치 자동 연결""가상 컴퓨터와 Bluetooth 장치 공유 "를 선택 해제 할 수도 있습니다 .
  • 환경에 따라 디스플레이 설정을 조정해야 할 수도 있습니다 (3D 비활성화, 화면 크기 적용).

주의:

  • netboot 설치를 선택한 경우, 소프트웨어 선택 화면 에 도달 할 때 데스크탑 환경 ( Ubuntu 데스크탑 또는 Xubuntu 데스크탑 ) 을 선택해야합니다. 그렇지 않으면 최소한의 텍스트 전용 환경이됩니다!
  • 처음 부팅 할 때 최신 릴리스로의 업그레이드를 거부 하십시오. 여기서 요점은 14.04입니다.

처음 부팅 할 때 가장 먼저 할 일은 Linux 게스트 도구를 설치하는 것입니다.

sudo apt-get install open-vm-tools

이 패킷은 부팅시 트리거를 설정하므로 게스트를 다시 시작한 후에 만 ​​설치가 완료됩니다.

Android 소스 코드 가져 오기

비슷하지만 절차 세부 사항은 선택한 ROM에 따라 다릅니다.

  • CyanogenMod의 경우, 장치를 검색 한 다음 (공급 업체를 먼저 선택) "CyanogenMod를 작성하는 방법" 링크를 클릭하여 장치에 맞는 지침을 얻으십시오.
  • AOSP의 경우 여기에서 시작 하는 절차를 따르십시오 .

CyanogeMod 번들은 소스 트리에 boot.img파일 압축을 풀 수있는 도구라는 점에 주목할 가치가 있습니다. 달리 말하면, CyanogenMod는 sepolicy장치 및 ROM 아카이브에 저장된 파일에 액세스 할 수있는 도구를 제공합니다 . Google의 AOSP는 이러한 도구를 제공하지 않으므로 CyanogenMod의 소스 트리를 사용하는 다른 명령이없는 경우 가장 편리한 선택 일 수 있습니다. 그렇지 않으면 appart를 설치해야합니다 (빠르고 쉽게 수행 할 수 있으므로 걱정하지 마십시오).

여기 CyanogenMod 13.0 (Android 6.0) 절차를 따르고 있습니다. 사용 된 명령에 대한 설명은 위에 링크 된 페이지에서 사용할 수 있습니다. 아래의 타이프 스크립트는 참조 용으로 만 제공됩니다.

팁 : 내가 사용하는 동안apt-get가장 낮은 공통 분모에 충실하고 모든 사람의 행복을 유지하기 위해이 게시물에, 당신은 사용하는 것이 좋습니다aptitude것이 더 나은 방법으로 종속성 돌봐 때문에 일부 종속성의 설치를 필요로하는 패키지를 제거 할 때 (대신 이러한 종속성도 제거되어 시스템을 더 깨끗하게 유지합니다). AFAIKaptitude명령은 Ubuntu에 설치해야하지만 Xubuntu에서 기본적으로 사용 가능합니다.

sudo apt-get install bison build-essential curl flex git gnupg gperf \
libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libwxgtk2.8-dev libxml2 \
libxml2-utils lzop maven openjdk-7-jdk pngcrush schedtool squashfs-tools \
xsltproc zip zlib1g-dev g++-multilib gcc-multilib lib32ncurses5-dev \
lib32readline-gplv2-dev lib32z1-dev
mkdir -p ~/bin
mkdir -p ~/android/system
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod u+x ~/bin/repo
cd ~/android/system/
git config --global user.name "Your Name"
git config --global user.email "you@example.com
repo init -u https://github.com/CyanogenMod/android.git -b cm-13.0
repo sync
# Coffee time: around 20GB are being downloaded, this may take several hours.
source ./build/envsetup.sh
breakfast

이제 깨끗하고 거의 완전한 소스 트리가 생겼습니다. 독점 Blob이 누락되었지만 SELinux 관련 태스크에 필요하지 않습니다.

팁 : 소스를 가져 오는 것은 지루한 과정이므로 지금은 VM의 스냅 샷 또는 백업을 수행하는 것이 좋습니다.

안드로이드 SELinux 툴셋 및 라이브러리 컴파일 및 설치

이제 여행의 재미있는 부분이 시작됩니다;)!

지금까지 절차는 매우 간단했습니다. 목표는 주로 나와 같은 환경을 유지하는 것입니다. 그렇게하면 속편도 그대로 유지됩니다.

실제로 Google은 버전간에 Android 소스 코드에 깊은 변경 사항을 적용하는 것을 망설이지 않으므로 정확한 컴파일 단계는 버전에 따라 다릅니다 (예 : AOSP 마스터는 sepolicy/디렉토리 가 이동 함을 보여줍니다 ).

먼저 안드로이드의 SElinux 라이브러리와 툴셋을 컴파일하고 설치하는 정확한 절차를 공유하지만 시간이 지남에 따라이 게시물의 관련성을 유지하기 위해 대부분의 컴파일 문제를 해결하기 위해 따라야 할 일반적인 접근 방식에 대한 메모를 추가 할 것입니다.

단계별 절차

Android의 SELinux 라이브러리는 추상화 계층을 제공하여 상위 계층 소프트웨어가 Android 특정 SELinux 정책 파일을 처리 할 수 ​​있도록합니다. 따라서 먼저 컴파일하고 설치해야합니다 (여러분이 어려움을 겪을 경우 실제로 그 핵심을 나타냅니다).

그런 다음 SELinux 도구를 빌드하고 설치할 수 있습니다. 앞으로 살펴 보 겠지만, 다행스럽게도 안드로이드 전용 일 필요는 없으며 SELinux 라이브러리 버전과 만 일치하면됩니다.

이 절차는 CyanogenMod 및 AOSP 소스 코드 트리를 사용하여 테스트되었습니다.

Android SELinux 라이브러리 및 첫 번째 도구 컴파일 및 설치

첫 설치 의존성 :

sudo apt-get install libapol-dev libaudit-dev libdbus-glib-1-dev libgtk2.0-dev \
libustr-dev python-dev python-networkx swig xmlto

이 포스트에서 변수 $ANDROID_BUILD_TOP는 소스 위치 ( repo sync명령 을 실행 한 디렉토리)를 저장합니다 . 원하는대로 이름을 자유롭게 변경하십시오.

ANDROID_BUILD_TOP=~/android/system
cd $ANDROID_BUILD_TOP
source ./build/envsetup.sh

기본적으로 restorecond의 Makefile이 일부 라이브러리를 찾을 수 없기 때문에 정책 코어 유틸리티 컴파일에 실패합니다 . pkg-config하드 코딩 된 경로 대신 동적으로 생성 된 경로를 사용하려면이 Makefile을 편집 해야합니다 (백틱을 작은 따옴표와 혼동하지 마십시오!).

sed -i 's/^CFLAGS ?= -g -Werror -Wall -W$/& `pkg-config --cflags --libs dbus-1 gtk+-2.0`/' \
$ANDROID_BUILD_TOP/external/selinux/policycoreutils/restorecond/Makefile

텍스트 편집기로 Makefile을 열어 수정 사항이 올바르게 적용되었는지 확인하십시오.

이제 컴파일하고 설치하십시오.

cd $ANDROID_BUILD_TOP/external/bzip2/
make -f Makefile-libbz2_so
sudo make install
cd $ANDROID_BUILD_TOP/external/libcap-ng/libcap-ng-0.7/
./configure
make
sudo make install
cd $ANDROID_BUILD_TOP/external/selinux/
make -C ./libsepol/
sudo make -C /libsepol/ install
EMFLAGS=-fPIC make -C ./libselinux/
sudo make -C ./libselinux/ install
make -C ./libsemanage/
sudo make -C ./libsemanage/ install
make
sudo make install
make swigify
sudo make install-pywrap
sudo cp ./checkpolicy/test/{dispol,dismod} /usr/bin/

주의 :EMFLAGS=-fPIC 빌드 할 때 환경 변수 설정을놓치지 마십시오libselinux. 아직 오류는 발생하지 않지만 다음 단계에서는 SETools를 빌드 할 수 없습니다. 당신이 그것을 놓치거나 다른 잘못을 한 경우, 단순히 a를 발행하고make clean컴파일을 다시 시작하십시오.

SELinux 도구 컴파일 및 설치

SELinux 도구는 다음을 포함하여 사전 빌드 된 형태로 제공됩니다.

  • $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/디렉토리 내의 Python 스크립트 및 해당 쉘 스크립트 랩퍼
  • 아래의 파이썬 패키지 ( *.o컴파일 된 파일 포함 ) $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/.

이 도구의 소스 코드는 아래 $ANDROID_BUILD_TOP/external에서 사용할 수있을 것으로 예상 했지만 그렇지 않습니다. 실제로 Google이 사용하는 SETools의 정확한 버전을 공유 한 곳을 찾지 못했습니다 (FPL은 수정 된 경우에만 코드를 공유하도록 지시합니다). .

도구 자체는 Python 스크립트이며, 이는 SETools 4 (SETools 3 sesearch에서 C로 바이너리 실행 코드 와 같은 명령)의 새로운 진화입니다 . 그러나 도구 자체에는 여전히 3.3.8 버전이 표시됩니다.

$ $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/sesearch --version
3.3.8

따라서 제 생각에는 Google이 SETools 4에서 초기 개발 스냅 샷을 찍었을 것입니다. 4.0.0 베타까지 SETools는 libsepolversoin 2.4에 의존 하고 4.0.0 릴리스에서는 버전 2.5와 호환되지 않는 라이브러리 버전 2.5에 의존하기 시작했습니다. SE 6.0은 안드로이드 6.0에 번들로 제공됩니다 (컴파일을 시도하면 실패합니다).

따라서 가장 현명한 선택은 SETools 4.0.0 Beta와 함께하는 것 같습니다.

추가 종속성을 설치하십시오.

sudo apt-get install python-setuptools

소스 코드를 다운로드하고 추출하십시오.

cd ~/android/
wget https://github.com/TresysTechnology/setools/archive/4.0.0-beta.tar.gz
tar xzf 4.0.0-beta.tar.gz
cd ./setools-4.0.0-beta/

Flex 2.5에 영향을주는 버그 로 인해 -Wredundant-decls컴파일러의 플래그에서 제거해야합니다 .

sed -i '/-Wredundant-decls/d' ./setup.py

마지막으로 컴파일하고 설치하십시오.

python ./setup.py build
sudo python ./setup.py install

일반적인 절차

위의 절차가 귀하의 경우에 효과가없는 경우 진행 방법에 대한 상위 수준의 견해입니다.

슬프게도 마법이 없으며 도우미가 없습니다 : () :이 코드를 컴파일하는 유일한 방법은 고전적이지만 두려운 순환 "try-and-see"접근법입니다.

처음 컴파일을 시도하면 일부 *.h파일을 찾지 못해 실패 할 가능성이 높습니다 .

  1. 안드로이드 external/디렉토리 에서 검색 :

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    요청 된 파일을 찾으면 해당 라이브러리 또는 도구의 특정 버전이 Android 소스 코드에 번들로 제공되었음을 의미합니다. 따라서 Ubuntu의 패키지 시스템에서 설치하지 말고 대신 Android 소스 코드에 번들로 제공되는 버전을 컴파일하여 설치하십시오.

    이는 포럼에서 찾을 수있는 일반적인 조언에 위배됩니다. "이 라이브러리가 없어 컴파일에 실패 했습니까?이 패키지를 설치하면 문제가 없습니다!" 특정 버전이 번들로 제공되는 경우 호환성 문제로 인해 또는이 버전에 Google의 특정 변경 사항이 포함되어 있기 때문에 특정 버전이 필요하기 때문일 수 있습니다.

    BTW, 당신이 궁금해하는 경우 : 물론이 라이브러리 또는 도구는 일부 *.h파일을 찾을 수 없기 때문에 오류를 발생시키는 종속성을 가질 수 있습니다. 그렇습니다.

  2. 시스템 전체 검색 :

    find / -name filename.h 2>/dev/null
    

    표준 공유 라이브러리 위치에서 시스템에 이미 존재하는 파일이 "없는"경우, 이는이 종속성이 사용자 환경에서 이미 충족되었지만 오류를 일으킨 Makefile이 파일을 찾기에는 너무 바보라는 것을 의미합니다.

    이 Makefile을 직접 직접 호출하는 경우이를 수정하는 일부 환경 변수를 설정하는 것이 가능할 수 있습니다 (예 LIBDIR=/usr/lib make를 들어), Makefile 자체를 수정해야 할 수도 있습니다 ( pkg-config명령은 누락 된 빌드 매개 변수를 자동으로 생성하는 데 도움이 될 수 있습니다) .

  3. 포장 시스템에서 검색 :

    apt-cache search filename-dev
    

    여기서 filename-dev누락 된 파일의 이름은 소문자로 .h확장명이 -dev접미사 로 바뀝니다 (예 : Python.h찾을 수없는 경우 검색 python-dev). 올바른 패키지를 찾으려면 정확한 이름을 약간 조정해야 할 수도 있습니다.

  4. 당신이 붙어 있고 인터넷에서 빠른 검색조차 명확한 대답을 제공하지 않았다면, apt-file가장 친한 친구가 될 것입니다. apt-file기본적으로 설치되어 있지 않은 경우 설치하고 데이터베이스를 생성해야합니다.

    sudo apt-get apt-file
    sudo apt-file update
    

    apt-file특정 파일을 제공하는 패키지 (제거 된 패키지도)를 검색 할 수 있습니다. 너무 많은 결과를 피하려면 다음과 grep같이 연결하는 것이 좋습니다 .

    apt-file search filename.h | grep -w filename.h
    

    이 파일을 제공하는 Ubuntu의 저장소에 패키지가 있으면 apt-file찾을 수 있어야합니다.

    당신이 바로 패키지를 발견하면, 그것은 사용하여 설치 apt-get install packagename위치를 packagename패키지의 이름입니다.

팁 : 시스템에 무언가를 조인 경우 패키지를 다시 설치하는 명령은 다음과 같습니다apt-get reinstall pkg_name. 의존성 (시스템 라이브러리에서 가장 가능성이 높음)이 깨져서 기존의 제거 및 설치가 불가능한 경우에도 작동합니다.

보충 도구

이 단계에서는 이제 컴파일 및 소스 형식의 Android SELinux 규칙을 조사 할 수있는 깨끗한 환경을 갖추어야합니다.

그러나 대부분의 가능성은 조사가 끝날 때 어떤 조치를 취하고 자 할 것입니다. 현재 상태에서는 사용자 환경에서 장치 sepolicy파일 을 수정할 수 없습니다 . 실제로이 파일은 쉽게 교체 할 수 없습니다.이 파일은 장치 루트 디렉토리의 일부이며 루트 디렉토리의 내용은 부팅시 RAM 디스크 파일에서 추출기이며 장치의 부팅 이미지에 저장됩니다.

따라서 환경이 완성되기 전에 여전히 두 가지를 놓칩니다.

  • 장치의 부팅 이미지에 액세스하고 수정하는 방법
  • sepolicy파일 을 수정하는 방법 .

다행스럽게도 이들은이 게시물의 마지막 두 섹션의 주제입니다! :)

장치의 부팅 이미지 가져 오기 및 업데이트

장치의 부팅 이미지를 가져 와서 업데이트하는 도구는 SELinux 규칙 변조 외에 다양한 용도로 사용할 수 있습니다. 따라서 전용 답변을 만들었 습니다. 참조하십시오.

장치의 SELinux 규칙 수정

여기에는 두 가지 주요 가능성이 있습니다.

  • sepolicy소스 트리의 규칙에서 새 파일을 작성하십시오 ( .te파일을 찾기 위해 파일을 검색하십시오. 파일이 find $ANDROID_BUILD_TOP -name \*.te여러 디렉토리로 분산 됨).
  • sepolicy장치에서 현재 사용중인 파일을 수정하십시오 .

처음부터 규칙을 처음부터 작성해야하는 경우가 아니라면 (개발과 관련한 작업이므로 범위를 벗어난 경우), 두 번째 선택은 가장 안전한 것으로 보입니다. 명시 적으로 만들었습니다.

sepolicy파일을 재 컴파일 가능한 형식으로 디 컴파일하여 그 사이의 규칙을 자유롭게 편집 할 수있는 도구를 만드는 프로젝트가 있습니다. 그러나이 프로젝트는 개념 증명 상태로 포기되었습니다. 이 블로그 게시물 끝에서 모든 정보를 찾을 수 있습니다.이 기사의 나머지 부분에는 관심있는 사람이 대신 할 수있는 충분한 세부 정보가 포함되어 있습니다.

현재 권장되는 sepolicy규칙 변경 방법 은 sepolicy이진 파일 을 직접 수정하여 다른 경로를 사용하는 것 입니다. sepolicy-inject 도구는이를 가능하게하고 적극적으로 유지됩니다.

완벽을 기하기 위해이 도구 의 포크 가 존재합니다. 그것은 몇 가지 기능을 추가합니다. 그중 일부는 원래 작성자의 할 일 목록에 있습니다 (규칙 제거 가능성과 같은). 기고하지 않고 포크를 선택한 이유를 묻지 마십시오 ...

컴파일하고 설치하려면 sepolicy-inject다음과 같이 진행하십시오.

cd ~/android/
git clone https://bitbucket.org/joshua_brindle/sepolicy-inject.git
cd ./sepolicy-inject/
LIBDIR=/usr/lib make
sudo cp ./sepolicy-inject /usr/bin/

사용 사례

예를 들어 다음 오류 메시지와 일치하는 자동화를 추가하려고한다고 가정 해 보겠습니다.

avc: denied { read } for pid=128 comm="file-storage"
path="/data/media/0/path/to/some/file"
dev="mmcblk0p28" ino=811035 scontext=u:r:kernel:s0
tcontext=u:object_r:media_rw_data_file:s0 tclass=file permissive=0

장치의 부팅 이미지를 가져온 다음 압축을 풀어 sepolicy파일에 액세스해야 합니다.

빠른 검사를 sesearch통해 실제로 허용 규칙이 없음을 알 수 있습니다 (아직!).

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
$

명령에 출력이 없습니다.

그런 다음 아래 명령을 사용하여 필요한 규칙을 추가하십시오 ( sesearchsepolicy-inject매개 변수 의 유사성에 유의하십시오 ).

sepolicy-inject -s kernel -t media_rw_data_file -c file -p read -P ./sepolicy

이제 sesearch명령을 다시 호출 할 수 있습니다 .

$ sesearch -A -s kernel -t media_rw_data_file -c file -p read ./sepolicy
allow kernel media_rw_data_file:file read;
$

sesearch 출력은 정책이 올바르게 업데이트되었음을 ​​나타냅니다.

이제 장치의 boot.img파일을 다시 포장하여 장치로 다시 플래시 할 수 있습니다 . /sepolicy파일 의 마지막 수정 시간 을 확인하면 장치에서 새로 업데이트 된 sepolicy파일을 쉽게 실행할 수 있습니다.

결론

이제 Android 장치 SELinux 정책을 자유롭게 검사하고 수정할 수있는 완벽한 환경이 갖추어야합니다. 즐겨! :)

참고로, 장치에서 직접 SELinux 정책을 분석하고 수정할 수있는 도구가 있습니다 .


1
한 마디 만 마셔 라 – 충분한 양의 커피를 마시지 않는 한 절대 "repo sync"를하지 말고;) 대신 "repo sync -q -f --force-sync -c"를 사용하면 많은 시간과 하드 드라이브 공간을 절약 할 수있다 . -q는 조용하고 -f 및 --force-sync는 일시적인 네트워크 오류가 발생하는 경우 진행하는 데 도움이됩니다. -c는 현재 분기 만 가져옵니다. 추신 또한 로컬 변경 사항을 완전히 지우고 매니페스트 버전으로 전환해야 할 때 개발 중에 "-d --prune"플래그를 사용합니다.
Oleksandr

@Oleksandr : 정보를 주셔서 감사합니다.이 정보를 아는 것이 좋습니다. 나는 -c깃발로 테스트 했지만 큰 차이는 발견하지 못했습니다 : 여전히 컴퓨터가 다운로드 할만 큼 많은 데이터 (25GB), 여전히 마시는 카페인이 많이 있습니다.). -f내 이해 repo에 따라 소스 코드의 일부를 다운로드하지 못했을 때 무시하고 최종 결과를 여전히 성공으로 간주하므로 플래그에 대해 약간 조심합니다 . "성공"상태를 전체 페치로 예약하고 파일이 무작위로 누락 될 수있는 알 수없는 상황에서는 자신을 찾지 않는 것이 좋습니다.
WhiteWinterWolf

2

먼저 AOSP 코드에서 6.0 이전 버전의 libsepol을 빌드 한 다음 sepolicy-inject, dispol 등을 링크하십시오. 이 레시피는 데비안 제시에서 저에게 효과적이었습니다.

cd /to/the/aosp/dir 
[repo init, etc]
repo sync external/selinux
cd external/selinux
git checkout android-6.0.0_r1^
cd libsepol
make
libsepol=`pwd`
cd /to/the/selinux-inject-source-dir
make LIBDIR=$libsepol

시스템의 libsepol과 연결된 sepolicy-inject와 달리 이것은 안드로이드 SDK에 포함 된 6.0 이미지의 / sepolicy와 잘 작동합니다.

$ sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_read: policydb version 30 does not match my version range 15-29
error(s) encountered while parsing configuration
Could not load policy
$ ./sepolicy-inject -Z shell -P /tmp/sepolicy -o /tmp/sepolicy 
libsepol.policydb_index_others: security:  1 users, 2 roles, 525 types, 0 bools
libsepol.policydb_index_others: security: 1 sens, 1024 cats
libsepol.policydb_index_others: security:  87 classes, 4767 rules, 0 cond rules

selinux 배포판에 포함 된 도구의 경우, 동일한 DESTDIR로 도구를 작성하는 것이 좋습니다.

cd libsepol
make DESTDIR=/some/dir install
cd ../checkpolicy
make DESTDIR=/some/dir
# here you have a working 'dispol' in the 'test' subdir

감사. 이것은 작동하는 것처럼 보이는 sedispol 버전을 제공했지만 여전히 sesearch를 컴파일 할 수 없습니다. Sesearch는 <apol/policy.h>(다른 policy.h파일 내에서) 포함 파일을 찾기 위해 죽습니다 . 어떤 모듈이 포함되어 있는지 알고 apol있습니까?
user3188445

@ user3188445 : 파일 apol/policy.h이 패키지에 의해 제공됩니다 libapol-dev(적어도 우분투 시스템에서는이 파일 입니다 ). 자세한 내용은 내 답변을 참조하십시오.
WhiteWinterWolf

1

문제가있는 사람들에게 :

policydb version 30 does not match my version range 15-29

AOSP 코드로 작업하는 동안

AOSP 코드가 ~ / android / source dir에 체크 아웃되었다고 가정합니다 .

cd ~/android/source
source build/envsetup.sh
export ANDROID_BUILD_TOP=$(pwd)

그리고 이제 번들 audit2allow 유틸리티를 자유롭게 사용할 수 있습니다 .

./external/selinux/prebuilts/bin/audit2allow

추신 : 또한 의견을 말하고 싶습니다 .Android (v30) selinux policy를 검토하십시오.

Sesearch는 (다른 policy.h 파일 내에서) include 파일을 찾기 위해 죽습니다. 어떤 모듈에 apol이 포함되어 있는지 알고 있습니까?

소스 https://github.com/SELinuxProject/selinux 에서 selinux 툴킷을 빌드하는 것은 그리 쉬운 일이 아닙니다 (Fedora를 사용하지 않는 한). 우분투에서는 (bison 및 C 컴파일러와 같은 기본 개발 도구를 이미 설치했다고 가정) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1을 설치해야합니다 -dev

그러나 결국 https://bugs.launchpad.net/ubuntu/+source/glib2.0/+bug/793155 때문에 여전히 컴파일하지 못했습니다. 어떻게 해결할 지 모르겠습니다.


1
또한 glibconfig.h게시물 끝에 링크하는 중이 오류가 발생 restorecond했습니다. 잘못된 경로가 하드 코드되어 있기 때문에의 Makefile에 의해 발생 했습니다. 를 사용하여 경로를 동적으로 확인하도록 수정해야합니다 pkg-config. 자세한 내용은 내 답변을 참조하십시오.
WhiteWinterWolf


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.