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" và "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.img
cá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 sepolicy
tệ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-get
trong 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ụngaptitude
thay 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). AFAIKaptitude
lệ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_TOP
lưu trữ vị trí nguồn của bạn (thư mục nơi bạn đã ban hành repo sync
lệ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 restorecond
Makefile 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-config
thay 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=-fPIC
cà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 clean
và 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
*.o
cá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 libsepol
2.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-decls
khỏ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 *.h
không tìm thấy một số tệp:
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ố *.h
tệ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.
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 make
ví dụ), nếu không bạn có thể cần sửa đổi Makefile ( pkg-config
lệnh có thể giúp ích tự động để tạo các tham số xây dựng bị thiếu) .
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 .h
phần mở rộng được thay thế bằng -dev
hậu tố (ví dụ: nếu Python.h
khô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.
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-file
sẽ là người bạn tốt nhất của bạn. apt-file
khô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-file
cho 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ó grep
như 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-file
có 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 sepolicy
tệ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
sepolicy
tậ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
sepolicy
tệp mới từ các quy tắc trong cây nguồn của bạn (tìm kiếm .te
cá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
sepolicy
tậ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 sepolicy
tệ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 sepolicy
quy tắc đi theo một lộ trình khác: bằng cách sửa đổi trực tiếp sepolicy
tệ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 sepolicy
tập tin của nó .
Kiểm tra nhanh bằng cách sử dụng sesearch
cho 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 sesearch
và sepolicy-inject
tham 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 sesearch
lệ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.img
tậ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 /sepolicy
tệ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 sepolicy
tệ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ị .