Info: Version 1.8.x is available.
Last modified: $Date: 2024-03-31 15:45:12 +0000 (Sun, 31 Mar 2024) $
このページでは、 TOMOYO Linux を arm 用 Android エミュレータ上で動作させる手順について説明します。ホスト環境として x86_64 上で動作している Ubuntu 10.04.3 を使用します。
https://source.android.com/source/download.html に示されているとおり、必要なパッケージをインストールします。
sudo add-apt-repository "deb http://archive.canonical.com/ lucid partner" sudo add-apt-repository "deb-src http://archive.canonical.com/ubuntu lucid partner" sudo apt-get update sudo apt-get install sun-java6-jdk sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev libc6-dev \ lib32ncurses5-dev ia32-libs x11proto-core-dev libx11-dev lib32readline5-dev lib32z-dev \ libgl1-mesa-dev g++-multilib mingw32 tofrodos python-markdown libxml2-utils xsltproc |
以下の内容を環境変数として指定します。 ~/.bashrc などに追加しておくことをお勧めします。
export ANDROID_HOME=$HOME/mydroid/ export ANDROID_IMG=$ANDROID_HOME/image/ |
エミュレータをコンパイルします。
mkdir -p $ANDROID_HOME cd $ANDROID_HOME wget https://dl-ssl.google.com/dl/googlesource/git-repo/repo chmod 755 repo ./repo init -u https://android.googlesource.com/platform/manifest -b android-4.0.1_r1 ./repo sync source build/envsetup.sh lunch full-eng make |
カーネルをコンパイルします。 TOMOYO Linux パッチを適用する以外は通常の手順と同じです。
mkdir -p $ANDROID_HOME/tmp cd $ANDROID_HOME/tmp/ git clone https://android.googlesource.com/kernel/goldfish cd goldfish/ git checkout origin/android-goldfish-2.6.29 wget https://sourceforge.net/projects/tomoyo/files/ccs-patch/1.7/ccs-patch-1.7.4-20240401.tar.gz wget https://sourceforge.net/projects/tomoyo/files/ccs-patch/1.7/ccs-patch-1.7.4-20240401.tar.gz.asc gpg ccs-patch-1.7.4-20240401.tar.gz.asc tar -zxf ccs-patch-1.7.4-20240401.tar.gz patch -p1 < patches/ccs-patch-2.6.29-android-goldfish.diff sed -i -e 's:/sbin/modprobe /sbin/hotplug::' -e 's:/sbin/ccs-start:/init:' -- security/ccsecurity/Kconfig ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s goldfish_armv7_defconfig ARCH=arm CROSS_COMPILE=$ANDROID_EABI_TOOLCHAIN/arm-linux-androideabi- make -s mkdir -p $ANDROID_IMG/tmp cp -p arch/arm/boot/zImage $ANDROID_IMG/kernel.img |
Android エミュレータで指定するためのイメージファイルをコピーします。
cd $ANDROID_HOME/out/target/product/generic/ cp -p system.img ramdisk.img userdata.img $ANDROID_IMG |
Android エミュレータを遠隔操作するために、ホスト側に TOMOYO Linux のツールをインストールします。
cd $ANDROID_HOME/tmp/ wget https://sourceforge.net/projects/tomoyo/files/ccs-tools/1.7/ccs-tools-1.7.3-20120301.tar.gz tar -zxf ccs-tools-1.7.3-20120301.tar.gz cd ccstools sudo apt-get install libreadline5-dev make sudo make install |
Android エミュレータ側にインストールするためのエージェントをコンパイルします。
Android エミュレータで使用するRAMディスクに含まれている /init.rc が /etc という名前で /system/etc/ ディレクトリへのシンボリックリンクを作成するため、(ステップ12で追加する TOMOYO Linux のポリシーローダである) /sbin/ccs-init が /etc/ccs/ ディレクトリを起動時に読み込むポリシーを保存しておくためのディレクトリとして使用することができません。そのため、 /etc/ccs/ の代わりに /ccs/ をポリシー用ディレクトリとして使用します。
cd $ANDROID_HOME/tmp/ wget -O agcc https://plausible.org/andy/agcc sed -i -e 's@4\.2\.1@4.4.3@g' -e 's@interwork/@@g' -- agcc chmod 755 agcc ./agcc -o init_policy $ANDROID_HOME/tmp/ccstools/init_policy.c ./agcc -o ccs-editpolicy-agent $ANDROID_HOME/tmp/ccstools/ccs-editpolicy-agent.c sed -e 's:etc/ccs:ccs:g' $ANDROID_HOME/tmp/ccstools/ccs-init.c > $ANDROID_HOME/tmp/ccstools/ccs-init2.c ./agcc -o ccs-init $ANDROID_HOME/tmp/ccstools/ccs-init2.c chmod 700 init_policy ccs-editpolicy-agent ccs-init |
Android エミュレータで使用するRAMディスクにエージェントをコピーし、自動的に起動されるようにします。
cd $ANDROID_IMG/tmp/ zcat ../ramdisk.img | cpio -id echo 'service ccs_agent /sbin/ccs-editpolicy-agent 0.0.0.0:7000' >> init.rc echo ' class core' >> init.rc echo ' oneshot' >> init.rc echo >> init.rc cp -p $ANDROID_HOME/tmp/init_policy $ANDROID_HOME/tmp/ccs-editpolicy-agent sbin/ find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img rm sbin/init_policy |
Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ8で作成したものを指定します。
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel |
TOMOYO Linux が使用するための初期状態のポリシーを作成します。初期状態のポリシーファイルをRAMディスクの中の /ccs/ ディレクトリにコピーします。
mkdir -p $ANDROID_IMG/tmp/ccs/ adb shell /sbin/init_policy policy_dir=/data/ccs/ adb pull /data/ccs/ $ANDROID_IMG/tmp/ccs/ adb shell rm /data/ccs/\* adb shell rmdir /data/ccs/ adb emu kill |
不足している file_pattern や allow_read などを例外ポリシーに追加します。以下の内容は一例です。ドメインポリシーでは全体をプロファイル1(学習モード)で動作させるように指定しています。マネージャにはエージェントプログラムだけを指定しています。
cd $ANDROID_IMG/tmp/ ( echo 'initialize_domain /init' echo 'initialize_domain /system/bin/app_process' echo 'file_pattern /dev/tty\$' echo 'file_pattern /system/lib/\@.so' echo 'allow_read /system/lib/\@.so' echo 'file_pattern /system/framework/\*.jar' echo 'allow_read /system/framework/\*.jar' echo 'file_pattern /system/media/audio/\*/\*' echo 'allow_read /system/media/audio/\*/\*' echo 'file_pattern /system/fonts/\*.ttf' echo 'allow_read /system/fonts/\*.ttf' echo 'file_pattern /data/tombstones/tombstone_\$' echo 'file_pattern /data/dalvik-cache/system@framework@\*.jar@classes.dex' echo 'file_pattern /data/dalvik-cache/system@app@\*.jar@classes.dex' echo 'file_pattern /data/dalvik-cache/data@app@\*@classes.dex' echo 'file_pattern /data/local/tmp/\*.apk' echo 'file_pattern /data/local/tmp/\*.apk' echo 'file_pattern /data/app/\*.tmp' echo 'file_pattern /data/data/\*/databases/\*' echo 'file_pattern /data/data/\*/databases/' echo 'file_pattern /data/dalvik-cache/system@framework@\*.jar@classes.dex' echo 'file_pattern /data/dalvik-cache/system@app@\*.apk@classes.dex' echo 'file_pattern /data/dalvik-cache/system@app-private@\*.apk@classes.dex' echo 'file_pattern /sdcard/dcim/.thumbnails/\$.jpg' echo 'file_pattern /sdcard/dcim/.thumbnails/.thumbdata\*' echo 'file_pattern /sdcard/dcim/.thumbnails/.thumbdata3--\$' echo 'path_group SYSTEM_APK /system/app/\@.apk' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_min' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_def' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_wmem_max' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_min' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_def' echo 'path_group SYS_FILES /sys/kernel/ipv4/tcp_rmem_max' echo 'allow_read /sys/devices/platform/\*battery\*/power_supply/ac/online' echo 'allow_read /sys/devices/platform/\*battery\*/power_supply/battery/\@' #App. specific data files echo 'file_pattern /data/data/com.android.browser/cache/webviewCache/\*' echo 'file_pattern /data/data/com.android.browser/app_thumbnails/\*' ) >> ccs/exception_policy.conf ( echo '<kernel>' echo 'use_profile 1' ) > ccs/domain_policy.conf echo /sbin/ccs-editpolicy-agent > ccs/manager.conf |
TOMOYO Linux を有効にするために、 /sbin/ccs-init を追加します。また、 /sbin/ccs-init の動作に必要なファイルも追加します。 Android 環境では、ダイナミックリンクライブラリをロードするために /system/bin/loader が使われます。しかし、 /sbin/ccs-init が実行される時点では /system/ パーティションはまだマウントされていません。そのため、 /system/ パーティションの中にある /bin/loader をRAMディスク内の /system/bin/ ディレクトリにコピーしておく必要があります。同様に、 /system/ パーティションの中にある /lib/libc.so と /lib/libm.so をRAMディスク内の /system/lib/ ディレクトリにコピーしておく必要があります。
cd $ANDROID_IMG/tmp/ mkdir -p system/bin system/lib cp -p $ANDROID_HOME/tmp/ccs-init sbin/ cp -p $ANDROID_HOME/out/target/product/generic/system/bin/linker system/bin/ cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libc.so system/lib/ cp -p $ANDROID_HOME/out/target/product/generic/system/lib/libm.so system/lib/ chmod 755 system/bin/linker system/lib/libc.so system/lib/libm.so find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
Android エミュレータを起動します。カーネルはステップ4で作成したものを、RAMディスクはステップ12で作成したものを指定します。
emulator -kernel $ANDROID_IMG/kernel.img -ramdisk $ANDROID_IMG/ramdisk.img -sysdir $ANDROID_IMG -data $ANDROID_IMG/userdata.img -show-kernel |
エミュレータ内で動作しているエージェントと通信するために、ポート転送を指定します。以下のように指定した場合、ホスト側でのポート 10000 への TCP 接続は、エミュレータ側でのポート 7000 へと転送されます。ステップ8で ccs-editpolicy-agent をポート 7000 で待機するように指定しているので、ホスト側でポート 10000 へ接続することにより、エージェントとの通信が可能になります。
adb forward tcp:10000 tcp:7000 |
以下のように ccs-editpolicy を起動すると、エミュレータ内のエージェント経由で ポリシーを閲覧/編集できます。
/usr/sbin/ccs-editpolicy 127.0.0.1:10000 |
以下のように ccs-savepolicy を実行すると、エミュレータ内のエージェント経由で現在のポリシーをRAMディスク内の /ccs/ ディレクトリに出力できます。
/usr/sbin/ccs-savepolicy edpm $ANDROID_IMG/tmp/ccs/ 127.0.0.1:10000 cd $ANDROID_IMG/tmp/ find . -print0 | cpio -o0 -H newc | gzip -9 > ../ramdisk.img |
以下のように ccs-auditd を起動すると、エミュレータ内のエージェント経由でアクセス許可ログ/拒否ログを取得して保存することができます。なお、アクセスログは大量に出力されるため、ディスクの空き容量に注意してください。
/usr/sbin/ccs-auditd /tmp/grant_log /tmp/reject_log 127.0.0.1:10000 |
以下のように ccs-queryd を実行すると、エミュレータ内のエージェント経由で、強制モードでのポリシー違反を対話的に処理できます。 ccs-queryd を終了させるには Ctrl-C を押してください。
/usr/sbin/ccs-queryd 127.0.0.1:10000 |