Kiểm tra chính sách selinux android (v30)


12

Tôi đang cố gắng tìm chính sách nào thực sự được thực thi bởi điện thoại của mình bằng cách sử dụng selinux. Bạn sẽ nghĩ rằng điều này sẽ dễ dàng. Rốt cuộc, để bảo mật, tốt nhất là xác minh rằng chính sách của bạn phù hợp với mong đợi. Thật không may, tôi đã thấy điều này cực kỳ khó thực hiện, vì A) android dường như sử dụng phiên bản chính sách rẽ nhánh 30 và B), chuỗi công cụ chính sách dường như có quy trình xây dựng chất lượng rất thấp (rất nhiều đường dẫn được mã hóa cứng, v.v. .).

Đây là hai điều tôi đã thử mà không hiệu quả. Nếu tôi cố gắng sử dụng các công cụ setools sẵn có (chẳng hạn như được đóng gói cho fedora hoặc có thể được cài đặt từ AUR với arch linux), thì tôi nhận được những điều sau (sau khi /sepolicylấy từ thư mục gốc của điện thoại hoặc hình ảnh nhà máy):

$ 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
$

Được rồi, điều đó cho thấy tôi phải xây dựng phiên bản Android của các thư viện selinux. Cây nguồn AOSP đi kèm với các phiên bản được biên dịch sẵn của một số công cụ nhưng chúng phụ thuộc vào các thư viện chia sẻ cũ mà tôi không có (như libpcre3). Dù sao, thật sốc nếu cách duy nhất để kiểm tra chính sách bảo mật của bạn là tin tưởng một số thư viện chia sẻ nhị phân mà bạn thoát khỏi mạng.

Vì vậy, đây là những gì tôi đã làm để xây dựng các thư viện selinux Android. Trên vòm, tôi đã phải cài đặt ustr-selinuxtừ AUR, vì ustr sử dụng inlineở nơi cần sử dụng static inline. Được rồi, cho đến nay rất tốt. Thật không may, quá trình xây dựng thực sự rất thô thiển, nhưng tôi đã có thể có đủ nó được biên dịch và cài đặt với những điều sau đây:

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"

Tại thời điểm này, thực hiện sedispolchính sách SElinux thông thường (như phiên bản 29 policy.29từ fedora), nhưng vẫn không cho tôi biết điều gì đang xảy ra với Android:

$ ~/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
$ 

Tôi cũng đã thử biên dịch các setools3công cụ vanilla chống lại các thư viện Android. Một lần nữa, không dễ dàng như vậy, nhưng tôi đã làm cho nó hoạt động với:

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

Điều này không xây dựng đầy đủ, nhưng xây dựng đủ cây nguồn mà tôi có thể thực thi secmds/sesearch. Đây là loại công việc trên một policy.29tập tin vanilla (tôi có thể tìm kiếm -A-T, nhưng --allcung cấp cho tôi operation not supported). Tuy nhiên, nó hoàn toàn thất bại với một lỗi tương tự khi thử kiểm tra tệp Android phiên bản 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
$ 

Tại thời điểm này, tâm trí của tôi đang loay hoay rằng công cụ xung quanh một cái gì đó rất quan trọng vì chính sách bảo mật hệ thống thực sự rất khó để xây dựng. Chắc chắn tôi phải làm gì đó sai. Có ai thực sự quản lý để kiểm tra một chính sách bảo mật Android mà không cần dựa vào các thư viện chia sẻ nhị phân phân phối bên ngoài?

Tôi nên thêm rằng tôi cũng đã thử các kỹ thuật được đề xuất để xây dựng lại tất cả các công cụ dựng sẵn ( ndk/build/tools/download-toolchain-sources.shndk/build/tools/rebuild-all-prebuilt.sh). Tuy nhiên, download-toolchain-sources.shkịch bản hiện đang bị hỏng. Nó cố gắng kiểm tra các thư mục phiên bản cũ không còn trong kho nữa, và dù sao thì nó dường như không tải xuống bất kỳ công cụ nào liên quan đến selinux, mặc dù thực tế đó prebuilts/pythoncó chứa mã liên quan đến selinux. Một lần nữa, tôi bị sốc về mức độ tồi tệ của các hệ thống xây dựng này và nghĩ rằng phải có một cách dễ dàng hơn. Câu hỏi làm thế nào tôi có thể có được các công cụ cho phép tôi kiểm tra chính sách selinux của Android?

Câu trả lời:


8

Trước hết, tôi phải thừa nhận rằng tôi hoàn toàn đồng ý với tuyên bố "Tôi đã thấy điều này cực kỳ khó thực hiện" . Google đã thiết kế Android chủ yếu từ góc độ người tiêu dùng và không dành cho người dùng quyền lực. Kết quả là, ngay khi bạn muốn làm gì đó ngoài việc sử dụng ứng dụng Facebook mới nhất hoặc chơi với Candy Crush, bạn sẽ nhanh chóng tìm lại chính mình trong thế giới đầu 2000 2000, khi cần phải thay đổi kiến ​​thức giống như nhà phát triển những gì nên được thiết lập đơn giản. Tôi tin rằng tình hình sẽ phát triển nhanh chóng khi hệ thống Android trưởng thành hơn, nhưng bây giờ chúng ta phải làm gì với những gì chúng ta có ...

Như bạn đã nói, có hai lý do tại sao cần phải biên dịch bộ công cụ SELinux của riêng bạn:

  • Các bộ công cụ được cung cấp thường là một phiên bản phía sau. Trong khi SELinux của Android dựa trên phiên bản DB chính sách 30, các hộp Linux hiện tại thường chỉ xử lý phiên bản tối đa 29.
  • Ngay cả khi gần đây nó sẽ không giúp ích gì, trên thực tế, việc xây dựng SELinux từ mã ngược dòng (được thực hiện dễ dàng, ít nhất là trên các máy Fedora theo khuyến nghị ngược dòng) cho phép hệ thống xử lý chính sách DB phiên bản 30, tuy nhiên, Selinux của Android đã được sửa đổi nặng ( tài liệu Google nêu bật một vài sửa đổi) vì vậy cố gắng xử lý SELinux của Android không thành công do lỗi cú pháp và phân tích cú pháp.

Vì vậy, để tiếp tục thực hiện nhiệm vụ phân tích SELinux của Android, chúng ta sẽ phải nhúng tay vào bụi bẩn ... theo cách sạch nhất có thể:

  • Đầu tiên chúng ta sẽ thiết lập một môi trường lành mạnh,
  • Sau khi hoàn thành, chúng tôi sẽ biên dịch các thư viện và công cụ đầu tiên của Android,
  • Trên hết, chúng tôi sẽ xây dựng các công cụ SELinux,
  • Chúng tôi sẽ hoàn thành bằng cách thêm một vài tiện ích bổ sung.

Thiết lập một môi trường thích hợp

Tính chất môi trường

Cách tốt nhất được đề xuất, một cách có thể chỉ có thể làm việc đáng tin cậy là dành một môi trường cho công việc Android của bạn:

  • Một máy ảo là hoàn toàn tốt (nếu không phải là lựa chọn tốt nhất). Thích sử dụng VMware hơn vì bạn sẽ phải kết nối điện thoại của mình qua USB với hệ thống khách. Qemu thay thế miễn phí dường như không xử lý tốt nhiệm vụ như vậy. Tôi đã không thử với phần mềm vir virization khác.

  • Nó sẽ cần phải là một hệ thống 64 bit, nếu không, mã sẽ không được biên dịch do các số nguyên có kích thước sai.

  • Nó được mạnh mẽ khuyến cáo, có thể bắt buộc, sử dụng một hệ thống Ubuntu. Thay vào đó, hãy sử dụng Xubfox nếu bạn thích môi trường máy tính để bàn nhẹ hơn của XFCE, điều này không thay đổi gói lõi và gói có sẵn của hệ thống và sẽ không ảnh hưởng đến công việc liên quan đến Android của bạn (bất cứ điều gì tôi nói về Ubuntu trong quy trình này cũng áp dụng cho Xubfox). Bạn có thể tìm thấy trong cây nguồn SELinux của Android, một số tệp ReadMe khuyến nghị sử dụng Fedora thay vào đó, các tệp này được kế thừa từ dự án SELinux của NSA ngược dòng và nội dung của chúng không nhất thiết phải khớp với Android của Google.

  • Phiên bản chính xác của Unbfox để sử dụng tùy thuộc vào phiên bản Android bạn muốn xây dựng. Đối với Android 6.0, Ubuntu 14.04 (Trusty) được khuyến nghị. Kiểm tra trang yêu cầu của Google để biết thêm thông tin.

  • Bạn sẽ cần nhiều dung lượng đĩa (ít nhất 50 GB nếu bạn chỉ lập kế hoạch điều tra liên quan đến SELinux, ít nhất 100 GB nếu bạn có kế hoạch xây dựng Android hoàn chỉnh). CPU và bộ nhớ ít liên quan hơn, chúng chỉ tác động đến thời gian cho bản dựng hoàn chỉnh và sẽ không có tác động thực sự đối với các tác vụ liên quan đến SELinux.

Sử dụng Ubuntu có hai ưu điểm chính:

  • Bằng cách sử dụng hệ thống được đề xuất, bạn đang làm việc trong một môi trường nổi tiếng và được kiểm tra tốt: thư viện hệ thống, công cụ và gói nằm ở phiên bản và vị trí mà dự án mong đợi.

  • Và cụ thể hơn trong trường hợp hiện tại của chúng tôi: Ubuntu tự dựa vào AppArmor, một công cụ thay thế SELinux, nó không sử dụng SELinux. Tin vui là do đó bạn sẽ có thể cài đặt các công cụ và nhị phân SELinux của Android trên toàn hệ thống mà không phải mạo hiểm để thay đổi độ tin cậy của hệ thống.

Quy trình lắp đặt môi trường

Bạn có thể cài đặt Ubuntu theo cách truyền thống bằng cách bắt đầu từ DVD trực tiếp đầy đủ, nhưng cách khác nhanh hơn là sử dụng cài đặt netboot (cài đặt mã văn bản) và chọn môi trường máy tính để bàn bạn thích ở cuối. Làm như vậy sẽ giúp bạn tiết kiệm thời gian cập nhật ban đầu bằng cách cài đặt trực tiếp phiên bản gói cập nhật thay vì cài đặt lần đầu tiên, sau đó yêu cầu áp dụng 389 bản cập nhật đang chờ xử lý trong lần khởi động đầu tiên.

Trình cài đặt netboot ISO cho Ubuntu / Xubfox 14.04 (cùng ISO) có sẵn tại đây .

Để bỏ qua tính năng "Easy Install" rắc rối của VMware, đây là một thói quen tốt để bắt đầu bằng cách chọn tùy chọn "Tôi sẽ cài đặt hệ điều hành sau" .

Hãy chắc chắn chọn Linux , sau đó là Ubuntu 64 bit làm HĐH khách.

VM sẽ cần các nguồn tài nguyên sau:

  • Bắt buộc: dung lượng ổ đĩa phải ở mức tối thiểu 40 GB (20 GB mặc định sẽ không đủ, chỉ riêng mã nguồn sẽ chiếm nhiều dung lượng hơn thế), khuyến nghị cao hơn. Bản dựng đầy đủ yêu cầu tối thiểu 100 GB đĩa, đây là giá trị tôi thường lấy. Đừng quên rằng cài đặt này chỉ là giới hạn tối đa: kích thước thực tế được VM thực hiện tăng lên linh hoạt với các yêu cầu của khách.
  • Facultative: Tăng RAM từ 1024 lên ít nhất 2048 hoặc cao hơn (tùy thuộc vào dung lượng máy chủ của bạn, tôi sử dụng 4096),
  • Facultative: Tăng số lượng lõi xử lý từ 1 lên 2 hoặc cao hơn (tùy thuộc vào dung lượng máy chủ của bạn, tôi sử dụng 3).
  • CD-Rom phải trỏ đến tệp ISO cài đặt.
  • Bạn có thể muốn chuyển USB từ 1.1 sang 2.0 mặc định vì trước đây có thể đưa ra cảnh báo khi bạn kết nối thiết bị của mình. Tùy thuộc vào cách sử dụng của bạn, bạn cũng có thể bỏ chọn "Tự động kết nối các thiết bị USB mới""Chia sẻ thiết bị Bluetooth với máy ảo" một cách an toàn .
  • Tùy thuộc vào môi trường của bạn, bạn cũng có thể cần phải điều chỉnh cài đặt hiển thị (tắt 3D, thực thi kích thước màn hình).

Chú ý:

  • Nếu bạn đã chọn cài đặt netboot, đừng quên chọn môi trường máy tính để bàn của bạn ( máy tính để bàn Ubuntu hoặc máy tính để bàn Xubfox ) khi đến màn hình chọn Phần mềm , hoặc bạn sẽ kết thúc với môi trường chỉ có văn bản tối thiểu!
  • Khi khởi động lần đầu, hãy từ chối nâng cấp lên bản phát hành mới nhất: toàn bộ vấn đề ở đây là ở lại trong 14.04!

Khi khởi động lần đầu tiên, một trong những điều đầu tiên bạn có thể muốn làm là cài đặt các công cụ khách Linux:

sudo apt-get install open-vm-tools

Gói này đặt các kích hoạt thời gian khởi động, do đó cài đặt của nó sẽ hoàn tất chỉ sau khi khách khởi động lại.

Lấy mã nguồn Android

Mặc dù tương tự, các chi tiết thủ tục phụ thuộc vào ROM đã chọn:

  • Đối với CyanogenMod, tìm kiếm thiết bị của bạn (chọn nhà cung cấp trước) sau đó nhấp vào liên kết "Cách xây dựng CyanogenMod" để được hướng dẫn điều chỉnh cho thiết bị của bạn.
  • Đối với AOSP, hãy làm theo quy trình bắt đầu tại đây .

Điều đáng chú ý là các gói CyanogeMod trong cây nguồn của nó là một công cụ cho phép bạn giải nén boot.imgcác tệp. Nói cách khác, CyanogenMod cung cấp cho bạn một công cụ cho phép bạn truy cập sepolicytệp được lưu trữ trong các thiết bị và kho lưu trữ ROM. AOSP của Google không cung cấp công cụ như vậy, vì vậy nếu bạn không có sự bắt buộc nào khác khi sử dụng cây nguồn của CyanogenMod có thể là lựa chọn thuận tiện nhất, nếu không, bạn sẽ phải cài đặt nó appart (rất nhanh và dễ làm, vì vậy không phải lo lắng ở đây).

Ở đây tôi đang làm theo quy trình CyanogenMod 13.0 (Android 6.0). Giải thích về các lệnh được sử dụng có sẵn trên các trang được liên kết ở trên. Vui lòng đọc chúng, bản thảo dưới đây chỉ được cung cấp cho mục đích tham khảo.

Mẹo: Mặc dù tôi sử dụngapt-gettrong bài đăng này để tuân theo mẫu số chung thấp nhất và giữ cho mọi người vui vẻ, bạn có thể thích sử dụngaptitudethay vì nó sẽ xử lý các phụ thuộc theo cách tốt hơn (khi xóa gói yêu cầu cài đặt một số phụ thuộc , những phụ thuộc này cũng sẽ bị xóa, khiến hệ thống của bạn sạch hơn). AFAIKaptitudelệnh phải được cài đặt trong Ubuntu nhưng có sẵn theo mặc định trên Xubfox.

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

Bây giờ bạn có một cây nguồn sạch và gần như hoàn chỉnh. Các đốm màu độc quyền bị thiếu, nhưng bạn không cần chúng cho các nhiệm vụ liên quan đến SELinux.

Mẹo: Tìm nạp các nguồn là một quá trình tẻ nhạt, có thể đáng để thực hiện một ảnh chụp nhanh hoặc sao lưu VM của bạn ngay bây giờ.

Biên dịch và cài đặt bộ công cụ và thư viện SELinux của Android

Bây giờ phần hài hước của chuyến đi bắt đầu;)!

Cho đến bây giờ các thủ tục nên đã được đơn giản. Mục tiêu chủ yếu là để đảm bảo rằng bạn có môi trường giống như tôi. Nếu bạn làm như vậy, phần tiếp theo cũng nên đơn giản.

Theo Google, đừng ngần ngại áp dụng các thay đổi sâu sắc cho mã nguồn của Android giữa các phiên bản, do đó các bước biên dịch chính xác sẽ hoàn toàn phụ thuộc vào phiên bản (ví dụ: AOSP master cho thấy sepolicy/thư mục sẽ được di chuyển ).

Trước tiên tôi sẽ chia sẻ quy trình chính xác của mình để biên dịch và cài đặt thư viện và bộ công cụ SElinux của Android, nhưng để giữ tính liên quan của bài đăng này theo thời gian, sau đó tôi sẽ thêm một số lưu ý về cách tiếp cận chung để giải quyết hầu hết các vấn đề biên dịch.

Thủ tục từng bước

Các thư viện SELinux của Android cung cấp lớp trừu tượng sẽ cho phép phần mềm lớp trên xử lý các tệp chính sách SELinux dành riêng cho Android. Do đó, chúng tôi sẽ cần phải soạn thảo và cài đặt chúng trước tiên (mà bản thân nó thực sự đại diện cho cốt lõi nếu những khó khăn ở đây, cho đến khi bạn tìm thấy con đường của mình).

Sau đó chúng tôi sẽ có thể xây dựng và cài đặt các công cụ SELinux. Như chúng ta sẽ thấy, may mắn thay, những thứ này không cần phải là Android cụ thể, chúng chỉ cần phù hợp với phiên bản thư viện SELinux.

Quy trình này đã được thử nghiệm cả bằng cách sử dụng cây mã nguồn CyanogenMod và AOSP.

Biên dịch và cài đặt thư viện Android và các công cụ đầu tiên của Android

Phụ thuộc cài đặt đầu tiên:

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

Trong bài đăng này, biến $ANDROID_BUILD_TOPlưu trữ vị trí nguồn của bạn (thư mục nơi bạn đã ban hành repo synclệnh). Hãy thay đổi tên của nó như bạn muốn.

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

Theo mặc định, quá trình biên dịch utils lõi chính sách không thành công do restorecondMakefile không thể định vị được một số thư viện. Bạn phải chỉnh sửa Makefile này để sử dụng các đường dẫn được tạo động pkg-configthay vì các đường dẫn được mã hóa cứng (đừng nhầm lẫn các backticks với các dấu ngoặc đơn!):

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

Vui lòng mở Makefile với một số trình soạn thảo văn bản để đảm bảo rằng sửa đổi đã được tính chính xác.

Và bây giờ biên dịch và cài đặt:

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/

Chú ý: Đừng bỏ lỡEMFLAGS=-fPICcài đặt biến môi trường khi xây dựnglibselinux. Nó sẽ không tạo ra bất kỳ lỗi nào, nhưng trong bước tiếp theo, bạn sẽ không thể xây dựng SETools. Trong trường hợp bạn bỏ lỡ nó hoặc làm bất cứ điều gì sai, chỉ cần phát hànhmake cleanvà khởi động lại quá trình biên dịch của bạn.

Biên dịch và cài đặt các công cụ SELinux

Các công cụ SELinux được cung cấp ở dạng dựng sẵn bao gồm:

  • Các tập lệnh Python (và trình bao bọc tập lệnh shell của chúng) trong $ANDROID_BUILD_TOP/external/selinux/prebuilts/bin/thư mục
  • Các gói Python (bao gồm *.ocác tệp được biên dịch) bên dưới $ANDROID_BUILD_TOP/prebuilts/python/linux-x86/2.7.5/lib/python2.7/site-packages/.

Tôi đã dự kiến ​​mã nguồn của các công cụ này sẽ có sẵn bên dưới $ANDROID_BUILD_TOP/external, nhưng không phải vậy. Trên thực tế, tôi không tìm thấy nơi nào Google chia sẻ phiên bản chính xác của SETools mà họ đã sử dụng (FYI GPL chỉ bắt buộc chia sẻ mã nếu nó đã được sửa đổi), vì vậy chúng tôi sẽ phải đoán và thử và làm tốt nhất có thể .

Bản thân các công cụ là các tập lệnh Python, đây là một sự phát triển mới từ SETools 4 (trong SETools 3, các lệnh giống như sesearchđược thực thi nhị phân được mã hóa trong C). Tuy nhiên, bản thân các công cụ vẫn hiển thị phiên bản 3.3.8:

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

Vì vậy, tôi đoán là Google đã chụp một số ảnh chụp nhanh phát triển ban đầu từ SETools 4. Cho đến khi 4.0.0 beta SETools dựa vào phiên bản libsepol2.4, với phiên bản 4.0.0, họ bắt đầu dựa vào phiên bản 2.5 của thư viện không tương thích với phiên bản của SELinux được gói trong Android 6.0 (bạn có thể thử biên dịch cái này, nó sẽ thất bại).

Vì vậy, sự lựa chọn khôn ngoan nhất dường như đi với SETools 4.0.0 Beta.

Cài đặt phụ thuộc bổ sung:

sudo apt-get install python-setuptools

Tải xuống và trích xuất mã nguồn:

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/

Do lỗi ảnh hưởng đến Flex 2.5, chúng tôi cần xóa -Wredundant-declskhỏi cờ của trình biên dịch:

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

Và cuối cùng biên dịch và cài đặt:

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

Quy trình chung (hoặc "Cách tự tháo gỡ")

Trong trường hợp quy trình trên không hoạt động trong trường hợp của bạn, đây là chế độ xem cấp cao hơn về cách cố gắng tiến bộ.

Đáng buồn là không có phép thuật (và không có người trợ giúp :() ở đây: cách duy nhất để biên dịch mã này là cách tiếp cận "thử và xem" theo chu kỳ cổ điển.

Hãy thử biên dịch lần đầu tiên, rất có thể nó sẽ thất bại do *.hkhông tìm thấy một số tệp:

  1. Tìm kiếm trong external/thư mục của Android :

    find $ANDROID_BUILD_TOP/external -name filename.h
    

    Nếu bạn tìm thấy tệp được yêu cầu, thì điều này có nghĩa là một phiên bản cụ thể của thư viện hoặc công cụ tương ứng đã được gói trong mã nguồn Android. Do đó, bạn không nên cố gắng cài đặt nó từ hệ thống gói của Ubuntu, mà thay vào đó hãy biên dịch và cài đặt phiên bản đi kèm trong mã nguồn Android.

    Xin lưu ý rằng điều này đi ngược lại lời khuyên chung mà bạn có thể tìm thấy trên các diễn đàn: "Quá trình biên dịch của bạn không thành công do thư viện này bị thiếu? Cài đặt gói này thì sẽ ổn thôi!" , bằng cách này, rất có thể bạn sẽ gặp vấn đề tồi tệ hơn: nếu một phiên bản cụ thể được đóng gói, rất có thể là do một phiên bản cụ thể là cần thiết (do vấn đề tương thích hoặc do phiên bản này có chứa các thay đổi cụ thể từ Google).

    BTW, nếu bạn đang tự hỏi: tất nhiên thư viện hoặc công cụ này cũng có thể có lỗi phụ thuộc do một số *.htệp không được tìm thấy, và vâng, bạn nên áp dụng phương pháp "thử và xem" theo chu kỳ này.

  2. Tìm kiếm trên toàn hệ thống:

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

    Nếu bạn thấy "thiếu" tệp đã có trong hệ thống của bạn ở một số vị trí thư viện dùng chung tiêu chuẩn, điều này có nghĩa là sự phụ thuộc này có thể đã được đáp ứng trong môi trường của bạn nhưng Makefile đã đưa ra lỗi quá ngu ngốc để tìm thấy nó.

    Nếu bạn gọi trực tiếp Makefile này theo cách thủ công, bạn có thể đặt một số biến môi trường sửa lỗi này ( LIBDIR=/usr/lib makeví dụ), nếu không bạn có thể cần sửa đổi Makefile ( pkg-configlệnh có thể giúp ích tự động để tạo các tham số xây dựng bị thiếu) .

  3. Tìm kiếm trong hệ thống đóng gói:

    apt-cache search filename-dev
    

    Trong đó filename-devđại diện cho tên của tệp bị thiếu bằng chữ thường với .hphần mở rộng được thay thế bằng -devhậu tố (ví dụ: nếu Python.hkhông tìm thấy, hãy tìm kiếm python-dev). Một số điều chỉnh trong tên chính xác có thể cần thiết để tìm đúng gói.

  4. Nếu bạn vẫn bị mắc kẹt và ngay cả một tìm kiếm nhanh trên Internet không cung cấp bất kỳ câu trả lời rõ ràng nào, thì đó apt-filesẽ là người bạn tốt nhất của bạn. apt-filekhông được cài đặt theo mặc định, bạn cần cài đặt nó và tạo cơ sở dữ liệu của nó:

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

    apt-filecho phép bạn tìm kiếm các gói (thậm chí đã gỡ cài đặt) cung cấp một tệp cụ thể. Để tránh có quá nhiều kết quả, tôi khuyên bạn nên liên kết với nó grepnhư dưới đây:

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

    Nếu có một gói trong kho lưu trữ của Ubuntu cung cấp tệp này, thì apt-filecó thể tìm thấy nó.

    Khi bạn đã tìm thấy gói phù hợp, hãy cài đặt nó bằng tên gói của bạn apt-get install packagenameở đâu packagename.

Mẹo: Nếu bạn vặn thứ gì đó trên hệ thống của mình, lệnh để cài đặt lại gói là cái này :apt-get reinstall pkg_name. Nó sẽ hoạt động ngay cả khi không thể gỡ bỏ cài đặt cổ điển do phá vỡ các phụ thuộc (rất có thể đối với các thư viện của hệ thống).

Công cụ bổ trợ

Ở bước này, bây giờ bạn sẽ có một môi trường sạch sẽ cho phép bạn điều tra các quy tắc SELinux của Android cả ở định dạng được biên dịch và nguồn.

Tuy nhiên, hầu hết các cơ hội là vào cuối cuộc điều tra của bạn, bạn sẽ muốn thực hiện một số hành động. Trong hình dạng hiện tại, môi trường của bạn sẽ không cho phép bạn sửa đổi sepolicytệp của thiết bị . Trên thực tế, tập tin này không thể thay thế dễ dàng: nó là một phần của thư mục gốc của thiết bị và nội dung của thư mục gốc được trích xuất tại thời điểm khởi động từ tệp đĩa RAM, lần lượt được lưu trong ảnh khởi động của thiết bị.

Vì vậy, bạn vẫn bỏ lỡ hai điều trước khi môi trường của bạn hoàn tất:

  • Một cách để truy cập và sửa đổi hình ảnh khởi động của thiết bị,
  • Một cách để sửa đổi sepolicytập tin của nó .

May mắn thay, đây chính xác là chủ đề của hai phần cuối của bài này! :)

Tìm nạp và cập nhật hình ảnh khởi động của thiết bị

Các công cụ để tìm nạp và cập nhật hình ảnh khởi động của thiết bị có thể được sử dụng cho nhiều thứ khác nhau ngoài các quy tắc giả mạo của Selinux. Do đó tôi đã tạo ra một câu trả lời dành riêng , xin vui lòng tham khảo nó.

Sửa đổi quy tắc SELinux của thiết bị

Bạn có hai khả năng chính ở đây:

  • Xây dựng một sepolicytệp mới từ các quy tắc trong cây nguồn của bạn (tìm kiếm .tecác tệp để tìm thấy chúng : find $ANDROID_BUILD_TOP -name \*.te, chúng được lan truyền vào một số thư mục).
  • Sửa đổi sepolicytập tin hiện đang được thiết bị sử dụng.

Trừ khi bạn thực sự cần xây dựng các quy tắc của mình từ đầu, đó là một nhiệm vụ liên quan đến phát triển và do đó nằm ngoài phạm vi ở đây, sự lựa chọn thứ hai dường như là an toàn nhất vì bạn chắc chắn rằng những thay đổi duy nhất sẽ là của bạn làm rõ ràng.

Đã có một dự án để tạo ra một công cụ cho phép bạn dịch ngược sepolicytệp thành dạng có thể biên dịch lại, cho phép tự do chỉnh sửa các quy tắc ở giữa. Tuy nhiên, dự án này đã bị bỏ rơi trong trạng thái bằng chứng khái niệm. Bạn sẽ tìm thấy tất cả thông tin ở cuối bài đăng blog này , phần còn lại của bài viết chứa đủ chi tiết để cho phép bất kỳ ai khác quan tâm tiếp quản.

Cách hiện tại được đề xuất để thay đổi sepolicyquy tắc đi theo một lộ trình khác: bằng cách sửa đổi trực tiếp sepolicytệp nhị phân. công cụ tiêm sepolicy chỉ cho phép điều đó và được duy trì tích cực.

Để hoàn thiện, lưu ý rằng một ngã ba của công cụ này tồn tại. Nó bổ sung một vài tính năng, một số trong số chúng nằm trong danh sách việc cần làm của tác giả ban đầu (như khả năng xóa quy tắc), đừng hỏi tôi tại sao họ chọn ngã ba thay vì đóng góp ...

Để biên dịch và cài đặt sepolicy-inject, chỉ cần tiến hành như sau:

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/

Ví dụ trường hợp sử dụng

Ví dụ, giả sử bạn muốn thêm tính năng tự động khớp với thông báo lỗi sau:

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

Bạn sẽ cần tìm nạp hình ảnh khởi động của thiết bị, sau đó giải nén nó để có quyền truy cập vào sepolicytập tin của nó .

Kiểm tra nhanh bằng cách sử dụng sesearchcho thấy thực sự không có quy tắc cho phép (chưa!):

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

Lệnh không có đầu ra.

Sau đó, sử dụng lệnh bên dưới để thêm quy tắc bắt buộc (lưu ý sự giống nhau giữa sesearchsepolicy-injecttham số):

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

Bây giờ chúng tôi có thể gọi lại sesearchlệnh của chúng tôi :

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

sesearch đầu ra cho thấy chính sách đã được cập nhật chính xác.

Bây giờ bạn có thể đóng gói lại boot.imgtập tin của thiết bị và flash lại vào thiết bị. Kiểm tra thời gian sửa đổi cuối cùng của /sepolicytệp là một cách dễ dàng để đảm bảo rằng thiết bị của bạn hiện đang chạy sepolicytệp mới được cập nhật .

Phần kết luận

Bây giờ bạn sẽ có một môi trường hoàn chỉnh cho phép bạn tự do kiểm tra và sửa đổi các chính sách SELinux của thiết bị Android. Thưởng thức! :)

Là một lưu ý phụ, cũng có các công cụ cho phép phân tích và sửa đổi chính sách SELinux trực tiếp từ thiết bị .


1
chỉ một lưu ý - không bao giờ thực hiện "repo sync" trừ khi bạn có nhiều cà phê để uống;) Thay vào đó, hãy sử dụng "repo sync -q -f --force-sync -c" - nó sẽ giúp bạn tiết kiệm hàng tấn thời gian và dung lượng ổ cứng . -q yên tĩnh, -f và --force-sync sẽ giúp bạn tiến hành trong trường hợp xảy ra lỗi mạng tạm thời, -c sẽ chỉ tìm nạp chi nhánh hiện tại. PS Tôi cũng sử dụng cờ "-d --prune" trong quá trình phát triển khi tôi cần xóa hoàn toàn mọi thay đổi cục bộ và chuyển sang phiên bản kê khai.
Oleksandr

@Oleksandr: Cảm ơn thông tin của bạn, điều này rất hữu ích để biết. Tôi đã thử nghiệm với -ccờ, nhưng không nhận thấy sự khác biệt lớn nào: vẫn có nhiều dữ liệu cho máy tính tải xuống (25 GB), vẫn còn nhiều caffeine cho tôi uống;). Tôi có một chút cảnh giác với -fcờ, theo sự hiểu biết của tôi, điều này sẽ buộc repophải bỏ qua khi không thể tải xuống một phần của mã nguồn và vẫn coi kết quả cuối cùng là một thành công. Tôi thích bảo lưu trạng thái "thành công" để tìm nạp hoàn chỉnh và tránh tìm thấy chính mình trong một tình huống không xác định nơi các tệp có thể bị thiếu ngẫu nhiên.
WhiteWinterWolf

2

Trước tiên, bạn nên xây dựng một phiên bản libsepol cũ hơn từ mã AOSP (giống như phiên bản 6.0 tương ứng), sau đó liên kết sepolicy-tiêm, disol, v.v. Công thức này làm việc cho tôi trên debian jessie:

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

Không giống như sepolicy-chích được liên kết với libsepol của hệ thống, cái này hoạt động tốt với / sepolicy từ hình ảnh 6.0 có trong sdk android:

$ 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

Đối với các công cụ có trong bản phân phối selinux, mẹo là xây dựng chúng với cùng một DESTDIR:

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

Cảm ơn. Điều này đã cho tôi một phiên bản sedispol dường như hoạt động, nhưng tôi vẫn không thể biên dịch Sesearch. Sesearch chết tìm kiếm tệp bao gồm <apol/policy.h>(từ trong một policy.htệp khác ). Bạn có biết mô-đun nào chứa apol?
dùng3188445

@ user3188445: Tệp apol/policy.hđược cung cấp bởi gói libapol-dev(ít nhất là tệp này trên các hệ thống Ubuntu). Vui lòng tham khảo câu trả lời của tôi để biết thêm thông tin chi tiết.
WhiteWinterWolf

1

Để những người phải đối mặt với vấn đề với:

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

trong khi làm việc với mã AOSP.

Giả sử, mã AOSP của bạn được kiểm tra tới ~ / android / nguồn dir:

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

Và bây giờ bạn có thể tự do sử dụng tiện ích Aud2allow kèm theo :

./external/selinux/prebuilts/bin/audit2allow

PS Ngoài ra, tôi muốn giải quyết chính sách Kiểm tra chính sách selinux android (v30)

Sesearch chết tìm kiếm tệp bao gồm (từ trong tệp chính sách khác.h). Bạn có biết mô-đun nào chứa apol?

Xây dựng bộ công cụ selinux từ các nguồn https://github.com/SELinuxProject/selinux không phải là rất nhỏ (trừ khi bạn đang sử dụng Fedora). Trên Ubuntu, bạn cần cài đặt (giả sử bạn đã cài đặt các công cụ dev cơ bản như trình biên dịch bison và C) libglib2.0-dev, libcap-ng-dev, xmlto, libsemanage1-dev, libustr-dev, libaudit-dev, libsepol1 -dev

Nhưng cuối cùng, tôi vẫn không thể biên dịch nó vì https://bugs.launchpad.net/ubfox/+source/glib2.0/+orms/793155 và không biết làm thế nào để giải quyết nó


1
Tôi cũng gặp phải glibconfig.hlỗi này khi bạn liên kết ở cuối bài đăng của mình, nó đã được đưa ra bởi restorecondMakefile vì các đường dẫn sai được mã hóa cứng trong đó. Bạn phải sửa đổi nó để cho phép nó tự động giải quyết các đường dẫn bằng cách sử dụng pkg-config. Xem câu trả lời của tôi để biết thêm chi tiết.
WhiteWinterWolf

1

Bạn nên cố gắng áp dụng bản vá này cho các nguồn libsepol, và sau đó tăng dần xây dựng lại tất cả những thứ đó. Nó làm việc cho tôi trong vấn đề sam

Bạn có thể thử sử dụng libsepol clone với bản vá được áp dụng từ repo này https: //metizik@bitbucket.org/metizik/selinux_tools.git Tôi sử dụng nó để xây dựng disol trong Windows và nó hoạt động tốt với tôi (vẫn nhận thấy rằng tôi ổn sử dụng cygwin cho việc này)


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.