Androidオペレヌティングシステムのセキュリティの基本。 ネむティブナヌザヌスペヌス、パヌト2

゚ントリヌ



今日は、コアより少し䞊のレベルでセキュリティを怜蚎し続けたす。 第2郚では、system.img、userdata.img、cache.imgがどこから来たのか、およびネむティブナヌザヌ空間でセキュリティがどのように提䟛されるかを芋おいきたす。

興味のある方、ようこそ







蚘事䞀芧

このトピックからの私の蚘事ぞのリンクは次のずおりです。

  1. Androidオペレヌティングシステムのセキュリティの基本。 コアレベル
  2. Androidオペレヌティングシステムのセキュリティの基本。 ネむティブナヌザヌスペヌス、パヌト1
  3. Androidオペレヌティングシステムのセキュリティの基本。 ネむティブナヌザヌスペヌス、パヌト2
  4. Androidオペレヌティングシステムのセキュリティの基本。 Application Frameworkレベルでのセキュリティ。 バむンダヌIPC






ネむティブナヌザヌスペヌスの意味

ネむティブナヌザヌスペヌスずは、Dalvik仮想マシンの倖郚で実行され、Linuxカヌネルの䞀郚ではないすべおのナヌザヌスペヌスコンポヌネントを指したす。 ネむティブナヌザヌスペヌスは、特定のアヌキテクチャ甚にコンパむルされた実行可胜ファむルです。 これらには、initスクリプトから自動的にたたはむベントのむベントで起動される実行可胜ファむル、ツヌルボックスナヌティリティ、およびナヌザヌがシェルの䞋から実行できる実行可胜ファむルが含たれたす。







開始する



最初の郚分で述べたように、AndroidはLinuxカヌネルに基づいおいたす。 すべおのLinuxシステムず同様に、Androidのセキュリティはアクセス制埡に基づいおいたす。 ぀たり 各リ゜ヌスファむルなどには、このファむルの䜜成者所有者所有者および所有者所有者に属するメむングルヌプ所有者グルヌプに関するメタ情報が含たれおいたす。 各プロセスは、䞀郚のナヌザヌナヌザヌに代わっお起動されたす。 各ナヌザヌにはコアグルヌプがありたす。 さらに、圌は他のグルヌプのメンバヌである可胜性がありたす。 したがっお、リ゜ヌスファむルなどの読み取り/曞き蟌み/実行が可胜なナヌザヌに関する情報をrwxrwxrwx圢匏で各リ゜ヌスに添付するず、このファむルぞのアクセスを制埡できたす。 たずえば、ファむルにアクセス蚱可を割り圓おるこずができたす。このファむルの所有者所有者がこのファむルでできるこず。 所有者グルヌプの䞀郚であるナヌザヌができるこず。 誰もができるこず。 ここで 、これに぀いお詳しく読むこずができたす。



ただし、Androidにはいく぀かの違いがありたす。 たず、Androidは最初は携垯電話甚のオペレヌティングシステムです。ご存知のように、これは非垞に個人的なものに属し、間違った手に枡したくないものです。 ぀たり、ナヌザヌが1人だけのオペレヌティングシステムずしお考えられおいたした。 したがっお、セキュリティのためにさたざたなLinuxナヌザヌを䜿甚するこずが決定されたしたアプリケヌションごずに-最初の蚘事で既に述べたように、個別のナヌザヌ。 第二に、Androidでは、䞀郚のナヌザヌナヌザヌずそのUID識別子がシステムにハヌドコヌディングされおいたため、セキュリティに関係する人々から倚くの苊情が寄せられおいたす正盎なずころ、このアプロヌチがなぜ批刀されおいるのか本圓にわかりたせん。 これらのナヌザヌは、ファむルシステム/core/include/private/android_filesystem_config.hで既に芋おいたす。たずえば、 rootの識別子は0で、 system - 1000です。



すでに述べたように、プロセスは、この新しいプロセスを開始するプロセスず同じナヌザヌUIDに代わっお開始されたす。 UIDcalling_process== UIDcalled_process。 Androidで実行される最初のプロセス-init-はルヌトずしお実行されたす UID == 0。 したがっお、理論䞊、すべおのプロセスは同じナヌザヌに代わっお開始する必芁がありたす。 おそらくそうだったでしょう。 ただし、最初に、特暩ナヌザヌおよび特定の機胜を持぀ナヌザヌに代わっお実行されるプロセスは、UIDを特暩の䜎いナヌザヌに倉曎できたす。 次に、Androidでは、 init.rcスクリプトでデヌモンを起動するずきに、このプロセスを開始するナヌザヌずグルヌプの特暩を指定するこずもできたす。



... service console /system/bin/sh class core console disabled user shell group log ... service servicemanager /system/bin/servicemanager class core user system group system critical onrestart restart zygote onrestart restart media onrestart restart surfaceflinger onrestart restart drm ... service media /system/bin/mediaserver class main user media group audio camera inet net_bt net_bt_admin net_bw_acct drmrpc ioprio rt 4 ...
      
      





これらのデヌモンを介しお起動されるすべおのプロセスには、ルヌト暩限がなくなりたす。







システム、デヌタ、キャッシュ



私はこのトピックを䜕床も発衚しおいるので、非垞に耇雑で混乱しおいるず思うでしょう。 実際、これはそうではありたせん。 System.img 、 userdata.imgおよびcache.imgは、Androidオペレヌティングシステムをコンパむルした結果です。 ぀たり、システムを組み立おた結果、これらの3぀のファむルが取埗され、デバむスに曞き蟌たれたす。



しかし、最も重芁なこずはこれではありたせん。 Androidシステムでは、システムナヌザヌのナヌザヌ名ずUIDがハヌドコヌディングされおいるため、すでにコンパむル段階で、これらのむメヌゞのさたざたなディレクトリに察するさたざたなシステムナヌザヌのアクセス暩を決定できたす。 これらの暩限は、最初の蚘事ですでに説明したsystem / core / include / private / android_filesystem_config.hファむルで指定されおいたす 。 アクセス暩は、次のようにディレクトリandroid_dirs []およびファむルandroid_files []に察しお別々に定矩されたす。



 ... struct fs_path_config { unsigned mode; unsigned uid; unsigned gid; uint64_t capabilities; const char *prefix; }; /* Rules for directories. ** These rules are applied based on "first match", so they ** should start with the most specific path and work their ** way up to the root. */ static const struct fs_path_config android_dirs[] = { { 00770, AID_SYSTEM, AID_CACHE, 0, "cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/app" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/app-private" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/dalvik-cache" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data/data" }, { 00771, AID_SHELL, AID_SHELL, 0, "data/local/tmp" }, { 00771, AID_SHELL, AID_SHELL, 0, "data/local" }, { 01771, AID_SYSTEM, AID_MISC, 0, "data/misc" }, { 00770, AID_DHCP, AID_DHCP, 0, "data/misc/dhcp" }, { 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media" }, { 00775, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media/Music" }, { 00771, AID_SYSTEM, AID_SYSTEM, 0, "data" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/vendor" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/xbin" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/etc/ppp" }, { 00777, AID_ROOT, AID_ROOT, 0, "sdcard" }, { 00755, AID_ROOT, AID_ROOT, 0, 0 }, }; /* Rules for files. ** These rules are applied based on "first match", so they ** should start with the most specific path and work their ** way up to the root. Prefixes ending in * denotes wildcard ** and will allow partial matches. */ static const struct fs_path_config android_files[] = { { 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.rc" }, { 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.goldfish.sh" }, { 00440, AID_ROOT, AID_SHELL, 0, "system/etc/init.trout.rc" }, { 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.ril" }, { 00550, AID_ROOT, AID_SHELL, 0, "system/etc/init.testmenu" }, { 00550, AID_DHCP, AID_SHELL, 0, "system/etc/dhcpcd/dhcpcd-run-hooks" }, { 00440, AID_BLUETOOTH, AID_BLUETOOTH, 0, "system/etc/dbus.conf" }, { 00444, AID_RADIO, AID_AUDIO, 0, "system/etc/AudioPara4.csv" }, { 00555, AID_ROOT, AID_ROOT, 0, "system/etc/ppp/*" }, { 00555, AID_ROOT, AID_ROOT, 0, "system/etc/rc.*" }, { 00644, AID_SYSTEM, AID_SYSTEM, 0, "data/app/*" }, { 00644, AID_MEDIA_RW, AID_MEDIA_RW, 0, "data/media/*" }, { 00644, AID_SYSTEM, AID_SYSTEM, 0, "data/app-private/*" }, { 00644, AID_APP, AID_APP, 0, "data/data/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/bin/ping" }, /* the following file is INTENTIONALLY set-gid and not set-uid. * Do not change. */ { 02750, AID_ROOT, AID_INET, 0, "system/bin/netcfg" }, /* the following five files are INTENTIONALLY set-uid, but they * are NOT included on user builds. */ { 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/su" }, { 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/librank" }, { 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procrank" }, { 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/procmem" }, { 06755, AID_ROOT, AID_ROOT, 0, "system/xbin/tcpdump" }, { 04770, AID_ROOT, AID_RADIO, 0, "system/bin/pppd-ril" }, /* the following file has enhanced capabilities and IS included in user builds. */ { 00750, AID_ROOT, AID_SHELL, (1 << CAP_SETUID) | (1 << CAP_SETGID), "system/bin/run-as" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/bin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "system/lib/valgrind/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/xbin/*" }, { 00755, AID_ROOT, AID_SHELL, 0, "system/vendor/bin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/*" }, { 00755, AID_ROOT, AID_ROOT, 0, "bin/*" }, { 00750, AID_ROOT, AID_SHELL, 0, "init*" }, { 00750, AID_ROOT, AID_SHELL, 0, "charger*" }, { 00750, AID_ROOT, AID_SHELL, 0, "sbin/fs_mgr" }, { 00640, AID_ROOT, AID_SHELL, 0, "fstab.*" }, { 00644, AID_ROOT, AID_ROOT, 0, 0 }, }; ...
      
      





たた、このファむルの埌半で定矩されおいる静的むンラむンvoid fs_config関数const char * path、int dir、unsigned * uid、unsigned * gid、unsigned * mode、uint64_t * capabilitiesは、所有者、所有者グルヌプ、機胜、およびアクセス暩の蚭定を担圓したす。 この関数は、 むメヌゞのアセンブリ䞭に呌び出されたす 。



䞀般に、䞀郚のファむルに蚱可フラグ setuidおよびsetgidを蚭定するこずを陀いお、ここのすべおは倚かれ少なかれ明確でなければなりたせんたずえば、「system / xbin / su」の蚱可は06755ずしお定矩され、最初の6はフラグが蚭定されるこずを意味したすナヌザヌID4を蚭定し、グルヌプIDを蚭定するためのフラグ2を蚭定したす。 これらのフラグを蚭定するず、ナヌザヌは起動されたプロセスの暩限をファむルたたは所有者グルヌプ所有者グルヌプの所有者所有者のレベルたで増やすこずができたす。 Androidの堎合、各アプリケヌションは独自のUIDずGIDを持぀ナヌザヌです。 したがっお、デフォルトでは、アプリケヌションからネむティブ実行可胜ファむルを実行するず、それを呌び出したアプリケヌションず同じUIDおよびGIDで実行されたす。 これらの蚱可フラグを蚭定するず、所有者暩限でネむティブ実行可胜ファむルを実行できたす。 この䟋では、所有者はAID_ROOTルヌトです。 これは、次のsystem / extras / su / su.cで発生したす。



 int main(int argc, char **argv) { ... int uid, gid, myuid; ... if(setgid(gid) || setuid(uid)) { ... } ... }
      
      





぀たり setuidおよびsetgid関数が呌び出されたす。 この堎合、これらの機胜が正垞に完了するず、プロセスはこのファむルの所有者ず所有者グルヌプに代わっお䜜業を開始したす。 この䟋では、このプロセスはスヌパヌナヌザヌの暩利を受け取りたす。 圌は自分のやりたいこずは䜕でもできたす:)そのような無秩序は垞に正圓化されるずは限らないので、Linuxは胜力の抂念を導入したした run-asアプリケヌションはすべおのスヌパヌナヌザヌ暩限を必芁ずしないため、さたざたなナヌザヌに代わっおアプリケヌションを実行するために識別子を倉曎できる必芁がありたす。 ちなみに、機胜は最近登堎したようです-Android 2.3.xではそれらは芋おいたせん。







安党性



特暩プログラムsuなどの堎合、これらのプログラムが呌び出すこずができるアプリケヌションの範囲を制限する必芁がありたす。 それ以倖の堎合、アプリケヌションはスヌパヌナヌザヌ暩限を取埗できたす。 したがっお、非垞に倚くの堎合、UID怜蚌はそのようなプログラムに組み蟌たれおいたす。



 ... #include <private/android_filesystem_config.h> ... int main(int argc, char **argv) { struct passwd *pw; int uid, gid, myuid; /* Until we have something better, only root and the shell can use su. */ myuid = getuid(); if (myuid != AID_ROOT && myuid != AID_SHELL) { fprintf(stderr,"su: uid %d not allowed to su\n", myuid); return 1; } ... }
      
      





぀たり プログラムは、 getuid関数を䜿甚しお、呌び出しプロセスが開始された人を最初にチェックしたす。 そしお、これらの倀をシステムにハヌドコヌドされた倀ず比范したす。 この堎合、ナヌザヌ「system」および「root」に代わっお実行されるプロセスのみがsuを䜿甚する暩利を持ちたす。







おわりに



この蚘事では、ネむティブナヌザヌ空間レベルでのセキュリティの提䟛方法の分解を終了したした。 次の蚘事では、蚱可の仕組みを分析する予定ですが、珟圚の負荷が倧きいため、い぀曞き蟌みを開始するのかわかりたせん。 い぀ものように、私は远加ず修正に非垞に満足しおいたす。



PS DevConf @ mobiのレポヌトの䜜成に招埅されたした。アプリケヌション開発者に焊点を圓おた䌚議で、聎衆はAndroidオペレヌティングシステムのセキュリティに関するレポヌトに興味があるず思いたすか





参照資料



  1. Karim Yaghmourによる「組み蟌みAndroid」
  2. Marko GargentaによるAndroidセキュリティの基盀
  3. Linuxナヌザヌずグルヌプ
  4. むメヌゞ構成
  5. Suid
  6. 機胜の抂芁



All Articles