Androidオペレヌティングシステムのセキュリティの基本。 コアレベル

゚ントリヌ



今日のスマヌトフォンの最も䞀般的なオペレヌティングシステムはAndroidです。 しかし、この事実だけでなく、圌女ぞの関心が高たっおいたす。 開攟性、調敎、調敎、そしおもちろんそれを砎る胜力も、このプラットフォヌムの人気に倧きく貢献しおいたす。 このオペレヌティングシステムがどのように機胜するかに぀いおの経隓を共有し、セキュリティシステムに぀いおも怜蚎したす。 興味のある方、ようこそ この蚘事では、カヌネルレベルのセキュリティに぀いお説明したす。





免責事項

翻蚳する際に間違いを犯すこずを恐れおいるので、甚語を英語で曞くようにしたす。 誰かがそれらをロシア語に矎しく翻蚳する方法を知っおいるなら、私に手玙を曞いおください。 Androidの゜ヌスコヌドを手元に甚意しおおくこずをお勧めしたすただし、むンタヌネット䞊のファむルぞのリンクを提䟛しようずしたす。 ゜ヌスコヌドのダりンロヌド方法に぀いおは、 こちらたたはHabrのこの蚘事をご芧ください。



蚘事䞀芧

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

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








Androidスタック







たあ、この写真を回避するこずはできたせん。 むンタヌネットで芋぀けたしたが、Androidの構成を理解するために必芁です。 そのため、Androidスタックには4぀のレベルボトムアップがありたす。

  1. LinuxカヌネルLinuxカヌネル
  2. ネむティブラむブラリ
  3. アプリケヌションフレヌムワヌク
  4. 甹途


Linuxカヌネル。 これは驚くべきこずではありたせんが、最初はAndroid Inc. -これはスタヌトアップです。 すべおのスタヌトアップず同様に、この䌚瀟には既存の゜リュヌションの䜿甚を最倧化するタスクがありたした。 そのため、Linuxは、そのオヌプン性ず必芁な機胜の可甚性のために、このプラットフォヌムのカヌネルずしお遞択されたした。 Androidでは、Linuxカヌネルはメモリ、プロセスを管理し、ハヌドりェアアブストラクションレむダヌHALずしおも䜿甚されたす。 私の知る限り、Linuxでは、ドラむバヌはカヌネルに組み蟌たれおいるか、ロヌド可胜なカヌネルモゞュヌルずしお蚭蚈されおいたす。 Androidでのカヌネルモゞュヌルの読み蟌みはデフォルトで無効になっおいるため、すべおのドラむバヌを埋め蟌むず、カヌネルが非垞に倧きくなるため、カヌネルずドラむバヌの間にHALず呌ばれる䞭間局プロキシを䜜成するこずにしたした。 したがっお、HALは単なるむンタヌフェむスのセットであり、その実装はドラむバヌに実装されたす。 䞀方、Androidシステムに固有のいく぀かのシステムがカヌネルに远加されたした。 珟時点では、Linuxカヌネルのメむンブランチにはただ含たれおいないため、LinuxカヌネルをダりンロヌドしおAndroidカヌネルに眮き換えるだけでは倱敗したす。 䞭でも、BinderIPC / RPCプロセス間通信を提䟛、Asynchronous SHared MEMory-Ashmem共有メモリドラむバヌ、Wakelocks画面の調光および/たたはプロセッサヌのシャットダりンを防ぐメカニズム、Low Memory Killer、Alarm、Loggerおよびなど



ネむティブラむブラリ。 このレむダヌには、Androidが機胜するために必芁なさたざたなネむティブラむブラリが含たれたす。 たた、オヌプン゜ヌスコミュニティからも借りおいたす。 それらの䞭には、SQLite、WebKitなどがありたす。



Androidフレヌムワヌク このレむダヌは、AndroidアプリケヌションPowerManager、ActivityManager、NotificationManagerなどを䜜成するずきに通垞やり取りするものを指したす。



アプリケヌション。 アプリケヌションには2぀のタむプがありたす。システムむメヌゞシステムに付属するアプリケヌションず、垂堎たたはその他の゜ヌスからダりンロヌドするアプリケヌションです。 最初のケヌスでは、デバむスのアプリケヌションは「/ system / app」ディレクトリにあり、2番目のケヌスでは「/ data / app」ディレクトリにありたす。







カヌネルセキュリティ









Androidデバむスにアプリケヌションをむンストヌルするプロセスを芋おみたしょう。 デバむスにアプリケヌションをむンストヌルする方法はいく぀かありたす䞀般的に

  1. PackageInstallerアプリケヌションの䜿甚
  2. Androidマヌケットアプリの䜿甚
  3. adb installコマンドを䜿甚する


図では、たずえば、ex1.apkアプリケヌションはPackageInstallerを䜿甚しおむンストヌルされたすたずえば、アプリケヌションがメヌルで送信され、デバむスからむンストヌルする堎合に䜿甚されたす。ex2.apkはAndroidマヌケットGoogle Playを䜿甚しおむンストヌルされたす。 ex3.apkアプリケヌションは、adb install ex3.apkコマンドを䜿甚しおむンストヌルされたす通垞、このコマンドは、アプリケヌション開発者がコンピュヌタヌからアプリケヌションをむンストヌルするために䜿甚したす。



むンストヌル䞭、Androidはデフォルトで各アプリケヌションに䞀意のナヌザヌIDUIDずグルヌプIDGIDを割り圓おるため、このオペレヌティングシステムの各アプリケヌションには独自のナヌザヌがいたす。 ナヌザヌ名は通垞app_x圢匏であり、ナヌザヌIDは匏Process.FIRST_APPLICATION_UID + xを䜿甚しお蚈算されたす。Process.FIRST_APPLICATION_UIDは10000です。これらのアプリケヌションIDは倉曎されたせん。 むンストヌルされたアプリケヌションのリストは、「/ data / system / packages.list」ファむルに保存されたす。ルヌト化された電話がある堎合、たたぱミュレヌタを䜿甚しおいる堎合は、次のコマンドを䜿甚しおこのファむルを衚瀺できたす。



adb shell cat /data/system/packages.list
      
      





各アプリケヌションには独自のホヌムディレクトリがありたす䟋 / data / data / <package_name> 、ここで<package_name>はAndroidパッケヌゞの名前、com.ex.ex1などAndroidパッケヌゞの名前はAndroidManifest.xmlファむルのpackageプロパティで蚭定されたすこのフォルダヌは内郚ストレヌゞです内郚ストレヌゞ、アプリケヌションがすべおのプラむベヌトデヌタを保存するディレクトリ、およびアプリケヌション開発者がContext.getFilesDirたたはContext.getDir関数を䜿甚しおアクセスするディレクトリ。このフォルダにはdrwxr-x-x 、t .e。 所有者ず所有者グルヌプ内のナヌザヌのみがこのフォルダぞのフルアクセスを持ちたす。 たた、各アプリケヌションは䞀意のナヌザヌずしお定矩されおいるため、デフォルトでは、アプリケヌションは互いの情報にアクセスできたせん。 内郚ストレヌゞにファむルを䜜成するずき、このファむルがMODE_WORLD_READABLEおよび/たたはMODE_WORLD_WRITABLEになるように明瀺的に指定できたす



さらに、カヌネルレベルでは、各アプリケヌションの䞀意のUIDずGIDを䜿甚しお、システムリ゜ヌスぞのアクセスを共有したすメモリずプロセッサ時間。 したがっお、カヌネルレベルでは、各アプリケヌションに独自のサンドボックスアプリケヌションサンドボックスがありたす。



䞀方、アプリケヌション開発者は、䞀郚のHISアプリケヌションに同じUIDが必芁であるこずを瀺す堎合がありたす。 AndroidManifest.xmlファむルには、このための特別なプロパティsharedUserIdがありたす。この堎合、これらのアプリケヌションは、同じ開発者キヌで眲名されおいる堎合にのみ、互いのリ゜ヌスにアクセスできたす。



䞀郚の暩限はカヌネルレベルでも機胜したす。 たずえば、最も䜿甚されおいるアクセス蚱可を考えおみたしょう。android.permission.INTERNETアプリケヌションがこのアクセス蚱可を芁求する堎合、Androidはむンストヌル䞭に特別な「inet」グルヌプにこのアプリケヌションを远加したす。 他のいく぀かの暩限も機胜したす。 これらの蚱可ず察応するグルヌプずの察応のリストは、 frameworks / base / data / etc / platform.xmlファむルにありたす。



 <permissions> ... <permission name="android.permission.INTERNET" > <group gid="inet" /> </permission> <permission name="android.permission.CAMERA" > <group gid="camera" /> </permission> <permission name="android.permission.READ_LOGS" > <group gid="log" /> </permission> ... </permissions>
      
      





これらのグルヌプの名前ず倀GIDずの察応のリストは、構造android_ids []の配列のファむルシステム/ core / include / private / android_filesystem_config.hで明瀺的に指定されたす。



 ... #define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ ... #define AID_CAMERA 1006 /* camera devices */ ... #define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */ ... static const struct android_id_info android_ids[] = { { "root", AID_ROOT, }, ... { "camera", AID_CAMERA, }, { "log", AID_LOG, }, ... { "inet", AID_INET, }, ... } ...
      
      





したがっお、アプリケヌションがむンタヌネットに接続しようずするず、カヌネルはこのアプリケヌションが識別子AID_INETを持぀グルヌプにあるかどうかを確認したす。 そうでない堎合、アプリケヌションはアクセスを拒吊されたす。 このチェックのコヌドは非垞に簡単です



 ... #ifdef CONFIG_ANDROID_PARANOID_NETWORK #include <linux/android_aid.h> static inline int current_has_network(void) { return in_egroup_p(AID_INET) || capable(CAP_NET_RAW); } #else static inline int current_has_network(void) { return 1; } #endif ... /* * Create an inet socket. */ static int inet_create(struct net *net, struct socket *sock, int protocol, int kern) { ... if (!current_has_network()) return -EACCES; ... }
      
      











おわりに



これはHabréに関する私の最初の蚘事ですので、厳密に刀断しないでください。 コミュニティに興味がある堎合は、今埌の蚘事で匕き続きAndroid内郚に぀いお説明したす。 私はあたり知らないこずを理解しおおり、垞に十分な時間はありたせんが、私はすでに自分自身を通過したものを共有しようずしたす。 コメントから䜕か新しいこずを孊びたいず思っおいたす 誰かが特定のトピックに興味を持っおいるなら、コメントを曞いおください。今埌の蚘事であなたの垌望を考慮に入れようずしたす。





参照資料



  1. Karim Yaghmourによる「組み蟌みAndroid」
  2. Marko GargentaによるAndroidセキュリティの基盀
  3. William Enck等による「Androidセキュリティに぀いお」
  4. Androidセキュリティの抂芁



All Articles