ÎÒÃÇÖªµÀ£¬Androidϵͳ»ùÓÚLinuxʵÏÖ¡£Õë¶Ô´«Í³Linuxϵͳ£¬NSA¿ª·¢ÁËÒ»Ì×°²È«»úÖÆSELinux£¬ÓÃÀ´¼ÓÇ¿°²È«ÐÔ¡£È»¶ø£¬ÓÉÓÚAndroidϵͳÓÐ×ŶÀÌØµÄÓû§¿Õ¼äÔËÐÐʱ£¬Òò´ËSELinux²»ÄÜÍêÈ«ÊÊÓÃÓÚAndroidϵͳ¡£Îª´Ë£¬NSAÕë¶ÔAndroidϵͳ£¬ÔÚSELinux»ù´¡ÉÏ¿ª·¢ÁËSEAndroid¡£±¾ÎľͶÔSEAndroid°²È«»úÖÆ¿ò¼Ü½øÐзÖÎö£¬ÒÔ±ãºóÃæ¿ÉÒÔ¸üºÃµØ·ÖÎöÆäʵÏÖϸ½Ú¡£
SEAndroid°²È«»úÖÆËùÒª±£»¤µÄ¶ÔÏóÊÇϵͳÖеÄ×ÊÔ´£¬ÕâЩ×ÊÔ´·Ö²¼ÔÚ¸÷¸ö×ÓϵͳÖУ¬ÀýÈçÎÒÃǾ³£½Ó´¥µÄÎļþ¾ÍÊÇ·Ö²¼Îļþ×ÓϵͳÖеġ£Êµ¼ÊÉÏ£¬ÏµÍ³ÖÐÐèÒª±£»¤µÄ×ÊÔ´·Ç³£¶à£¬³ýÁËÇ°ÃæËµµÄÎļþÖ®Í⣬»¹Óнø³Ì¡¢socketºÍipcµÈµÈ¡£¶ÔÓÚAndroidϵͳÀ´Ëµ£¬ÓÉÓÚʹÓÃÁËÓ봫ͳLinuxϵͳ²»Ò»ÑùµÄÓû§¿Õ¼äÔËÐÐʱ£¬¼´Ó¦ÓóÌÐòÔËÐÐʱ¿ò¼Ü£¬Òò´ËËüÔÚÓû§¿Õ¼äÓÐÒ»Ð©ÌØÓеÄ×ÊÔ´ÊÇÐèÒªÌØ±ð±£»¤µÄ£¬ÀýÈçϵͳÊôÐÔµÄÉèÖá£
½ÓÏÂÀ´£¬ÎÒÃǾÍͨ¹ýͼ1À´¹Û²ìSEAndroid°²È«»úÖÆµÄÕûÌå¿ò¼Ü£¬ÈçÏÂËùʾ£º

ͼ1 SEAndroid°²È«»úÖÆ¿ò¼Ü
´Óͼ1¿ÉÒÔ¿´µ½£¬ÒÔSELinuxÎļþϵͳ½Ó¿ÚΪ±ß½ç£¬SEAndroid°²È«»úÖÆ°üº¬ÓÐÄں˿ռäºÍÓû§¿Õ¼äÁ½²¿·ÖÖ§³Ö¡£ÔÚÄں˿ռ䣬Ö÷񻃾¼°µ½Ò»¸ö³ÆÎªSELinux
LSMµÄÄ£¿é¡£¶øÔÚÓû§¿Õ¼äÖУ¬Éæµ½Security Context¡¢Security ServerºÍSEAndroid
PolicyµÈÄ£¿é¡£ÕâЩÄں˿ռäÄ£¿éºÍÓû§¿Õ¼äÄ£¿éµÄ×÷ÓÃÒÔ¼°½»»¥ÈçÏÂËùʾ£º
1. Äں˿ռäµÄSELinux LSMÄ£¿é¸ºÔðÄÚºË×ÊÔ´µÄ°²È«·ÃÎÊ¿ØÖÆ¡£
2. Óû§¿Õ¼äµÄSEAndroid PolicyÃèÊöµÄÊÇ×ÊÔ´°²È«·ÃÎʲßÂÔ¡£ÏµÍ³ÔÚÆô¶¯µÄʱºò£¬Óû§¿Õ¼äµÄSecurity
ServerÐèÒª½«ÕâЩ°²È«·ÃÎʲßÂÔ¼ÓÔØÄں˿ռäµÄSELinux LSMÄ£¿éÖÐÈ¥¡£ÕâÊÇͨ¹ýSELinuxÎļþϵͳ½Ó¿ÚʵÏֵġ£
3. Óû§¿Õ¼äµÄSecurity ContextÃèÊöµÄÊÇ×ÊÔ´°²È«ÉÏÏÂÎÄ¡£SEAndroidµÄ°²È«·ÃÎʲßÂÔ¾ÍÊÇÔÚ×ÊÔ´µÄ°²È«ÉÏÏÂÎÄ»ù´¡ÉÏʵÏֵġ£
4. Óû§¿Õ¼äµÄSecurity ServerÒ»·½ÃæÐèÒªµ½Óû§¿Õ¼äµÄSecurity ContextÈ¥¼ìË÷¶ÔÏóµÄ°²È«ÉÏÏÂÎÄ£¬ÁíÒ»·½ÃæÒ²ÐèÒªµ½Äں˿ռäÈ¥²Ù×÷¶ÔÏóµÄ°²È«ÉÏÏÂÎÄ¡£
5. Óû§¿Õ¼äµÄselinux¿â·â×°Á˶ÔSELinuxÎļþϵͳ½Ó¿ÚµÄ¶Áд²Ù×÷¡£Óû§¿Õ¼äµÄSecurity
Server·ÃÎÊÄں˿ռäµÄSELinux LSMÄ£¿éʱ£¬¶¼ÊǼä½ÓµØÍ¨¹ýselinux½øÐеġ£ÕâÑù¿ÉÒÔ½«¶ÔSELinuxÎļþϵͳ½Ó¿ÚµÄ¶Áд²Ù×÷·â×°³É¸üÓÐÒâÒåµÄº¯Êýµ÷Óá£
6. Óû§¿Õ¼äµÄSecurity Serverµ½Óû§¿Õ¼äµÄSecurity ContextÈ¥¼ìË÷¶ÔÏóµÄ°²È«ÉÏÏÂÎÄʱ£¬Í¬ÑùÒ²ÊÇͨ¹ýselinux¿âÀ´½øÐеġ£
½ÓÏÂÀ´£¬ÎÒÃǾʹÓÄں˿ռäºÍÓû§¿Õ¼äÁ½¸ö½Ç¶ÈÀ´·ÖÎöSEAndroid°²È«»úÖÆ¿ò¼Ü¡£
Ò». Äں˿ռä
ÔÚÄں˿ռäÖУ¬´æÔÚÒ»¸öSELinux LSMÄ£¿é£¬Õâ¸öÄ£¿é°üº¬ÓÐÒ»¸ö·ÃÎÊÏòÁ¿»º³å£¨Access Vector
Cache£©ºÍÒ»¸ö°²È«·þÎñ£¨Security Server£©¡£Security Server¸ºÔð°²È«·ÃÎÊ¿ØÖÆÂß¼£¬¼´ÓÉËüÀ´¾ö¶¨Ò»¸öÖ÷Ìå·ÃÎÊÒ»¸ö¿ÍÌåÊÇ·ñÊǺϷ¨µÄ¡£ÕâÀï˵µÄÖ÷ÌåÒ»°ã¾ÍÊÇÖ¸½ø³Ì£¬¶ø¿ÍÌå¾ÍÊÇÖ÷ÌåÒª·ÃÎʵÄ×ÊÔ´£¬ÀýÈçÎļþ¡£
ÓëSELinux Security ServerÏà¹ØµÄÒ»¸öÄÚºË×ÓÄ£¿éÊÇLSM£¬È«³ÆÊÇLinux Security
Model¡£LSM¿ÉÒÔ˵ÊÇΪÁËSELinux¶øÉè¼ÆµÄ£¬µ«ÊÇËüÊÇÒ»¸öͨÓõݲȫģ¿é£¬SELinux¿ÉÒÔʹÓã¬ÆäËüµÄÄ£¿éҲͬÑù¿ÉÒÔʹÓá£ÕâÌåÏÖÁËLinuxÄÚºËÄ£¿éµÄÒ»¸öÖØÒªÉè¼ÆË¼Ï룬ֻÌṩ»úÖÆÊµÏÖ¶ø²»Ìṩ²ßÂÔʵÏÖ¡£ÔÚÎÒÃÇÕâ¸öÀý×ÓÖУ¬LSMʵÏֵľÍÊÇ»úÖÆ£¬¶øSELinux¾ÍÊÇÔÚÕâÌ×»úÖÆÏµÄÒ»¸ö²ßÂÔʵÏÖ¡£Ò²¾ÍÊÇ˵£¬ÄãÒ²¿ÉÒÔͨ¹ýLSMÀ´ÊµÏÖ×Ô¼ºµÄÒ»Ì×MAC°²È«»úÖÆ¡£
SELinux¡¢LSMºÍÄÚºËÖеÄ×ÓϵͳÊÇÈçºÎ½»»¥µÄÄØ£¿Ê×ÏÈ£¬SELinux»áÔÚLSMÖÐ×¢²áÏàÓ¦µÄ»Øµ÷º¯Êý¡£Æä´Î£¬LSM»áÔÚÏàÓ¦µÄÄں˶ÔÏó×ÓϵͳÖлá¼ÓÈëһЩHook´úÂë¡£ÀýÈ磬ÎÒÃǵ÷ÓÃϵͳ½Ó¿Úreadº¯ÊýÀ´¶Áȡһ¸öÎļþµÄʱºò£¬¾Í»á½øÈëµ½Äں˵ÄÎļþ×ÓϵͳÖС£ÔÚÎļþ×ÓϵͳÖиºÔð¶ÁÈ¡Îļþº¯Êývfs_read¾Í»áµ÷ÓÃLSM¼ÓÈëµÄHook´úÂë¡£ÕâЩHook´úÂë¾Í»áµ÷ÓÃ֮ǰSELinux×¢²á½øÀ´µÄ»Øµ÷º¯Êý£¬ÒÔ±ãºóÕß¿ÉÒÔ½øÐа²È«¼ì²é¡£
SELinuxÔÚ½øÐа²È«¼ì²éµÄʱºò£¬Ê×ÏÈÊÇ¿´Ò»ÏÂ×Ô¼ºµÄAccess Vector CacheÊÇ·ñÒѾÓнá¹û¡£Èç¹ûÓеϰ£¬¾ÍÖ±½Ó½«½á¹û·µ»Ø¸øÏàÓ¦µÄÄÚºË×Óϵͳ¾Í¿ÉÒÔÁË¡£Èç¹ûûÓеϰ£¬¾ÍÐèÒªµ½Security
ServerÖÐÈ¥½øÐмì²é¡£¼ì²é³öÀ´µÄ½á¹ûÔÚ·µ»Ø¸øÏàÓ¦µÄÄÚºË×ÓϵͳµÄͬʱ£¬Ò²»á±£´æÔÚ×Ô¼ºµÄAccess Vector
CacheÖУ¬ÒÔ±ãÏ´οÉÒÔ¿ìËٵصõ½¼ì²é½á¹û¡£
ÉÏÃæÃèÊöµÄ°²È«·ÃÎÊ¿ØÖÆÁ÷³Ì¿ÉÒÔͨ¹ýͼ2À´×ܽᣬÈçÏÂËùʾ£º

ͼ2 SELinux°²È«·ÃÎÊ¿ØÖÆÁ÷³Ì
´Óͼ2¿ÉÒÔ¿´µ½£¬ÄÚºËÖеÄ×ÊÔ´ÔÚ·ÃÎʵĹý³ÌÖУ¬Ò»°ãÐèÒª»ñµÃÈý´Î¼ì²éͨ¹ý£º
1. Ò»°ãÐÔ´íÎó¼ì²é£¬ÀýÈç·ÃÎʵĶÔÏóÊÇ·ñ´æÔÚ¡¢·ÃÎʲÎÊýÊÇ·ñÕýÈ·µÈ¡£
2. DAC¼ì²é£¬¼´»ùÓÚLinux UID/GIDµÄ°²È«¼ì²é¡£
3. SELinux¼ì²é£¬¼´»ùÓÚ°²È«ÉÏÏÂÎĺͰ²È«²ßÂԵݲȫ¼ì²é¡£
¶þ. Óû§¿Õ¼ä
ÔÚÓû§¿Õ¼äÖУ¬SEAndroid°üº¬ÓÐÈý¸öÖ÷ÒªµÄÄ£¿é£¬·Ö±ðÊǰ²È«ÉÏÏÂÎÄ£¨Security Context£©¡¢°²È«²ßÂÔ£¨SEAndroid
Policy£©ºÍ°²È«·þÎñ£¨Security Server£©¡£½ÓÏÂÀ´ÎÒÃǾͷֱð¶ÔËüÃǽøÐÐÃèÊö¡£
1. °²È«ÉÏÏÂÎÄ
SEAndroidÊÇÒ»ÖÖ»ùÓÚ°²È«²ßÂÔµÄMAC°²È«»úÖÆ¡£ÕâÖÖ°²È«²ßÂÔÓÖÊǽ¨Á¢ÔÚ¶ÔÏóµÄ°²È«ÉÏÏÂÎĵĻù´¡Éϵġ£ÕâÀïËù˵µÄ¶ÔÏó·ÖΪÁ½ÖÖÀàÐÍ£¬Ò»ÖÖ³ÆÖ÷Ì壨Subject£©£¬Ò»ÖÖ³ÆÎª¿ÍÌ壨Object£©¡£Ö÷Ìåͨ³£¾ÍÊÇÖ¸½ø³Ì£¬¶ø¿Í¹Û¾ÍÊÇÖ¸½ø³ÌËùÒª·ÃÎʵÄ×ÊÔ´£¬ÀýÈçÎļþ¡¢ÏµÍ³ÊôÐԵȡ£
°²È«ÉÏÏÂÎÄʵ¼ÊÉϾÍÊÇÒ»¸ö¸½¼ÓÔÚ¶ÔÏóÉϵıêÇ©£¨Tag£©¡£Õâ¸ö±êǩʵ¼ÊÉϾÍÊÇÒ»¸ö×Ö·û´®£¬ËüÓÉËIJ¿·ÖÄÚÈÝ×é³É£¬·Ö±ðÊÇSELinuxÓû§¡¢SELinux½ÇÉ«¡¢ÀàÐÍ¡¢°²È«¼¶±ð£¬Ã¿Ò»¸ö²¿·Ö¶¼Í¨¹ýÒ»¸öðºÅÀ´·Ö¸ô£¬¸ñʽΪ¡°user:role:type:sensitivity¡±¡£
ÀýÈ磬ÔÚ¿ªÆôÁËSEAndroid°²È«»úÖÆµÄÉ豸ÉÏÖ´Ðдø-ZÑ¡ÏîµÄlsÃüÁ¾Í¿ÉÒÔ¿´µ½Ò»¸öÎļþµÄ°²È«ÉÏÏÂÎÄ£º
$ ls -Z /init.rc -rwxr-x--- root root u:object_r:rootfs:s0 init.rc |
ÉÏÃæµÄÃüÁîÁгöÎļþ/init.rcµÄ°²È«ÉÏÏÂÎÄΪ¡°u:object_r:rootfs:s0¡±£¬Õâ±íÃ÷Îļþ/init.rcµÄSELinuxÓû§¡¢SELinux½ÇÉ«¡¢ÀàÐͺͰ²È«¼¶±ð·Ö±ðΪu¡¢object_r¡¢rootfsºÍs0¡£
ÓÖÈ磬ÔÚ¿ªÆôÁËSEAndroid°²È«»úÖÆµÄÉ豸ÉÏÖ´Ðдø-ZÑ¡ÏîµÄpsÃüÁ¾Í¿ÉÒÔ¿´µ½Ò»¸ö½ø³ÌµÄ°²È«ÉÏÏÂÎÄ£º
$ ps -Z LABEL USER PID PPID NAME u:r:init:s0 root 1 0 /init ...... |
ÉÏÃæµÄÃüÁîÁгö½ø³ÌinitµÄ°²È«ÉÏÏÂÎÄΪ¡°u:r:init:s0¡±£¬Õâ±íÃ÷½ø³ÌinitµÄSELinuxÓû§¡¢SELinux½ÇÉ«¡¢ÀàÐͺͰ²È«¼¶±ð·Ö±ðΪu¡¢r¡¢initºÍs0¡£
ÔÚ°²È«ÉÏÏÂÎÄÖУ¬Ö»ÓÐÀàÐÍ£¨Type£©²ÅÊÇ×îÖØÒªµÄ£¬SELinuxÓû§¡¢SELinux½ÇÉ«ºÍ°²È«¼¶±ð¶¼¼¸ºõ¿ÉÒÔºöÂÔ²»¼ÆµÄ¡£ÕýÒòΪÈç´Ë£¬SEAndroid°²È«»úÖÆÓÖ³ÆÎªÊÇ»ùÓÚTE£¨Tyoe
Enforcement£©²ßÂԵݲȫ»úÖÆ¡£²»¹ýΪÁË·½±ãÀí½â°²È«ÉÏÏÂÎÄ£¬½ÓÏÂÀ´ÎÒÃÇ»¹ÊǼòµ¥µØ¶ÔSELinuxÓû§¡¢SELinux½ÇÉ«ºÍ°²È«¼¶±ðµÄ×÷ÓýøÐнéÉÜ¡£
¶ÔÓÚ½ø³ÌÀ´£¬SELinuxÓû§ºÍSELinux½ÇɫֻÊÇÓÃÀ´ÏÞÖÆ½ø³Ì¿ÉÒÔ±ê×¢µÄÀàÐÍ¡£¶ø¶ÔÓÚÎļþÀ´Ëµ£¬SELinuxÓû§ºÍSELinux½ÇÉ«¾Í¿ÉÒÔÍêÈ«ºöÂÔ²»¼Æ¡£ÎªÁËÍêÕûµØÃèÊöÒ»¸öÎļþµÄ°²È«ÉÏÏÂÎÄ£¬Í¨³£½«ËüµÄSELinux½ÇÉ«¹Ì¶¨Îªobject_r£¬¶ø½«ËüµÄSELinuxÓû§ÉèÖÃΪ´´½¨ËüµÄ½ø³ÌµÄSELinuxÓû§¡£
ÔÚSEAndroidÖУ¬Ö»¶¨ÒåÁËÒ»¸öSELinuxÓû§u£¬Òò´ËÎÒÃÇͨ¹ýps -ZºÍls -ZÃüÁî¿´µ½µÄËùÓеĽø³ÌºÍÎļþµÄ°²È«ÉÏÏÂÎÄÖеÄSELinuxÓû§¶¼Îªu¡£Í¬Ê±£¬SEAndroidÒ²Ö»¶¨ÒåÁËÒ»¸öSELinux½ÇÉ«r£¬Òò´Ë£¬ÎÒÃÇͨ¹ýps
-ZÃüÁî¿´µ½µÄËùÓнø³ÌµÄ°²È«ÉÏÏÂÎÄÖеÄSELinux½ÇÉ«¶¼Îªr¡£
ͨ¹ýexternal/sepolicy/usersºÍexternal/sepolicy/rolesÎļþµÄÄÚÈÝ£¬ÎÒÃǾͿÉÒÔ¿´µ½SEAndroidËù¶¨ÒåµÄSELinuxÓû§ºÍSELinux½ÇÉ«¡£
Îļþexternal/sepolicy/usersµÄÄÚÈÝÈçÏÂËùʾ£º
user u roles { r } level s0 range s0 - mls_systemhigh; |
ÉÏÊöÓï¾äÉùÃ÷ÁËÒ»¸öSELinuxÓû§u£¬Ëü¿ÉÓõÄSELinux½ÇɫΪr£¬ËüµÄĬÈϰ²È«¼¶±ðΪs0£¬¿ÉÓõݲȫ¼¶±ð·¶Î§Îªs0~mls_systemhigh£¬ÆäÖУ¬mls_systemhighΪϵͳ¶¨ÒåµÄ×î¸ß°²È«¼¶±ð¡£
Îļþexternal/sepolicy/rolesµÄÄÚÈÝÈçÏÂËùʾ£º
role r; role r types domain; |
µÚÒ»¸öÓï¾äÉùÃ÷ÁËÒ»¸öSELinux½ÇÉ«r£»µÚ¶þ¸öÓï¾äÔÊÐíSELinux½ÇÉ«rÓëÀàÐÍdomain¹ØÁª¡£
ÉÏÃæÌáµ½£¬¶ÔÓÚ½ø³ÌÀ´Ëµ£¬SELinuxÓû§ºÍSELinux½ÇɫֻÊÇÓÃÀ´ÏÞÖÆ½ø³Ì¿ÉÒÔ±ê×¢µÄÀàÐÍ£¬ÕâÊÇÈçºÎÌåÏÖµÄÄØ£¿ÒÔÇ°ÃæÁгöµÄexternal/sepolicy/usersºÍexternal/sepolicy/rolesÎļþÄÚÈÝÀ´Àý£¬Èç¹ûûÓгöÏÖÆäËüµÄuser»òÕßroleÉùÃ÷£¬ÄÇô¾ÍÒâζ×ÅÖ»ÓÐu¡¢rºÍdomain¿ÉÒÔ×éºÏÔÚÒ»ÆðÐγÉÒ»¸öºÏ·¨µÄ°²È«ÉÏÏÂÎÄ£¬¶øÆäËüÐÎʽµÄ°²È«ÉÏÏÂÎ͍Òå¾ùÊÇ·Ç·¨µÄ¡£
¶ÁÕß¿ÉÄÜ×¢Òâµ½£¬Ç°ÃæÎÒÃÇͨ¹ýps -ZÃüÁî¿´µ½½ø³ÌinitµÄ°²È«ÉÏÏÂÎÄΪ¡°u:r:init:s0¡±£¬°´ÕÕÉÏÃæµÄ·ÖÎö£¬ÕâÊDz»ÊÇÒ»¸ö·Ç·¨µÄ°²È«ÉÏÏÂÎÄÄØ£¿´ð°¸ÊÇ·ñ¶¨µÄ£¬ÒòΪÔÚÁíÍâÒ»¸öÎļþexternal/sepolicy/init.teÖУ¬Í¨¹ýtypeÓï¾äÉùÃ÷ÁËÀàÐÍinit£¬²¢ÇÒ½«domainÉèÖÃΪÀàÐÍinitµÄÊôÐÔ£¬ÈçÏÂËùʾ£º
ÓÉÓÚinit¾ßÓÐÊôÐÔdomain£¬Òò´ËËü¾Í¿ÉÒÔÏñdomainÒ»Ñù£¬¿ÉÒÔºÍSELinuxÓû§uºÍSELinux½ÇÉ«×éºÏÔÚÒ»ÆðÐγɺϷ¨µÄ°²È«ÉÏÏÂÎÄ¡£
¹ØÓÚSELinuxÓû§ºÍSELinux½ÇÉ«£¬ÎÒÃǾͽéÉܵ½ÕâÀ½ÓÏÂÀ´ÎÒÃÇÔÙ½éÉܰ²È«¼¶±ð¡£°²È«¼¶±ðʵ¼ÊÉÏÒ²ÊÇÒ»¸öMAC°²È«»úÖÆ£¬ËüÊǽ¨Á¢ÔÚTEµÄ»ù´¡Ö®Éϵġ£ÔÚSELinuxÖУ¬°²È«¼¶±ðÊÇ¿ÉÑ¡µÄ£¬Ò²¾ÍÊÇ˵£¬¿ÉÒÔÑ¡ÔñÆôÓûòÕß²»ÆôÓá£
°²È«¼¶±ð×ʼµÄÄ¿µÄÊÇÓÃÀ´¶ÔÕþ¸®·ÖÀàÎļþ½øÐзÃÎÊ¿ØÖƵġ£ÔÚ»ùÓÚ°²È«¼¶±ðµÄMAC°²È«»úÖÆÖУ¬Ö÷Ì壨subject£©ºÍ¿ÍÌ壨object£©¶¼¹ØÁªÓÐÒ»¸ö°²È«¼¶±ð¡£ÆäÖУ¬°²È«¼¶±ð½Ï¸ßµÄÖ÷Ìå¿ÉÒÔ¶ÁÈ¡°²È«¼¶±ð½ÏµÍµÄ¿ÍÌ壬¶ø°²È«¼¶±ð½ÏµÍµÄÖ÷Ìå¿ÉÒÔдÈ밲ȫ¼¶±ð½Ï¸ßµÄ¿ÍÌ塣ǰÕß³ÆÎª¡°read
down¡±£¬¶øºóÕß³ÆÎª¡°write up¡±¡£Í¨¹ýÕâÖÖ¹æÔò£¬¿ÉÒÔÔÊÐíÊý¾Ý´Ó°²È«¼¶±ð½ÏµÍµÄÖ÷ÌåÁ÷Ïò°²È«¼¶±ð½Ï¸ßµÄÖ÷Ì壬¶øÏÞÖÆÊý¾Ý´Ó°²È«¼¶±ð½Ï¸ßµÄÖ÷ÌåÁ÷Ïò°²È«¼¶±ð½ÏµÍµÄÖ÷Ì壬´Ó¶øÓÐЧµØ±£»¤ÁËÊý¾Ý¡£×¢Ò⣬Èç¹ûÖ÷ÌåºÍ¿ÍÌåµÄ°²È«¼¶±ðÊÇÏàͬµÄ£¬ÄÇôÖ÷ÌåÊÇ¿ÉÒÔ¶Ô¿ÍÌå½øÐжÁºÍдµÄ¡£
ͨ¹ýͼ3¿ÉÒÔ¿´µ½»ùÓÚ°²È«¼¶±ðµÄMAC°²È«»úÖÆµÄÊý¾ÝÁ÷Ïò¿ØÖÆ£¬ÈçÏÂËùʾ£º

ͼ3 »ùÓÚ°²È«¼¶±ðµÄMAC°²È«»úÖÆÊý¾ÝÁ÷
ÔÚͼ3ÖУ¬ÎÒÃǶ¨ÒåÁËÁ½¸ö°²È«¼¶±ð£ºPUBLICºÍSECRET£¬ÆäÖУ¬SECRETµÄ°²È«¼¶±ð¸ßÓÚPUBLIC¡£
ÔÚʵ¼ÊʹÓÃÖУ¬°²È«¼¶±ðÊÇÓÉÃô¸ÐÐÔ£¨Sensitivity£©ºÍÀà±ð£¨Category£©Á½²¿·ÖÄÚÈÝ×é³ÉµÄ£¬¸ñʽΪ¡°sensitivity[:category_set]¡±£¬ÆäÖУ¬category_setÊÇ¿ÉÑ¡µÄ¡£ÀýÈ磬¼ÙÉèÎÒÃǶ¨ÒåÓÐs0¡¢s1Á½¸öSensitivity£¬ÒÔc0¡¢c1¡¢c2Èý¸öCategory£¬ÄÇô¡°s0:c0,c1¡±±íʾµÄ¾ÍÊÇSensitivityΪs0¡¢CategoryΪc0ºÍc1µÄÒ»¸ö°²È«¼¶±ð¡£
½éÉÜÍê³ÉSELinuxÓû§¡¢SELinux½ÇÉ«ºÍ°²È«¼¶±ðÖ®ºó£¬×îºóÎÒÃǾͽéÉÜÀàÐÍ¡£ÔÚSEAndroidÖУ¬ÎÒÃÇͨ³£½«ÓÃÀ´±ê×¢ÎļþµÄ°²È«ÉÏÏÂÎÄÖеÄÀàÐͳÆÎªfile_type£¬¶øÓÃÀ´±ê×¢½ø³ÌµÄ°²È«ÉÏÏÂÎĵÄÀàÐͳÆÎªdomain£¬²¢ÇÒÿһ¸öÓÃÀ´ÃèÊöÎļþ°²È«ÉÏÏÂÎĵÄÀàÐͶ¼½«file_typeÉèÖÃΪÆäÊôÐÔ£¬Ã¿Ò»¸öÓÃÀ´½ø³Ì°²È«ÉÏÏÂÎĵÄÀàÐͶ¼½«domainÉèÖÃΪÆäÊôÐÔ¡£
½«Ò»¸öÀàÐÍÉèÖÃΪÁíÒ»¸öÀàÐ͵ÄÊôÐÔ¿ÉÒÔͨ¹ýtypeÓï¾äʵÏÖ¡£ÀýÈ磬ÎÒÃÇÇ°ÃæÌáµ½µÄÓÃÀ´ÃèÊö½ø³ÌinitµÄ°²È«²ßÂÔµÄÎļþexternal/sepolicy/init.te£¬¾ÍʹÓÃÒÔϵÄtypeÓï¾äÀ´½«ÀàÐÍ
domainÉèÖÃÀàÐÍinitµÄÊôÐÔ£º
ÕâÑù¾Í¿ÉÒÔ±íÃ÷initÃèÊöµÄÀàÐÍÊÇÓÃÀ´ÃèÊö½ø³ÌµÄ°²È«ÉÏÏÂÎĵġ£
ͬÑù£¬Èç¹ûÎÒÃDz鿴ÁíÍâÒ»¸öÎļþexternal/sepolicy/file.te£¬¿ÉÒÔ¿´µ½AppÊý¾ÝÎļþµÄÀàÐÍÉùÃ÷£º
type app_data_file, file_type, data_file_type; |
ÉÏÊöÓï¾ä±íÃ÷ÀàÐÍapp_data_file¾ßÓÐÊôóÓfile_type£¬¼´ËüÊÇÓÃÀ´ÃèÊöÎļþµÄ°²È«ÉÏÏÂÎĵġ£
Á˽âÁËSEAndroid°²È«»úÖÆµÄ°²È«ÉÏÏÂÎÄÖ®ºó£¬ÎÒÃǾͿÉÒÔ¼ÌÐøAndroidϵͳÖеĶÔÏóµÄ°²È«ÉÏÏÂÎÄÊÇÈçºÎ¶¨ÒåµÄÁË¡£ÕâÀïÎÒÃÇÖ»ÌÖÂÛËÄÖÖÀàÐ͵ĶÔÏóµÄ°²È«ÉÏÏÂÎÄ£¬·Ö±ðÊÇApp½ø³Ì¡¢AppÊý¾ÝÎļþ¡¢ÏµÍ³ÎļþºÍϵͳÊôÐÔ¡£ÕâËÄÖÖÀàÐͶÔÏóµÄ°²È«ÉÏÏÂÎÄͨ¹ýËĸöÎļþÀ´ÃèÊö£ºmac_permissions.xml¡¢seapp_contexts¡¢file_contextsºÍproperty_contexts£¬ËüÃǾùλÓÚexternal/sepolicyĿ¼ÖС£
Îļþexternal/sepolicy/mac_permissions.xmlµÄÄÚÈÝÈçÏÂËùʾ£º
<?xml version="1.0" encoding="utf-8"?> <policy> <!-- Platform dev key in AOSP --> <signer signature="@PLATFORM" > <seinfo value="platform" /> </signer> <!-- Media dev key in AOSP --> <signer signature="@MEDIA" > <seinfo value="media" /> </signer> <!-- shared dev key in AOSP --> <signer signature="@SHARED" > <seinfo value="shared" /> </signer> <!-- release dev key in AOSP --> <signer signature="@RELEASE" > <seinfo value="release" /> </signer> <!-- All other keys --> <default> <seinfo value="default" /> </default> </policy> |
Îļþmac_permissions.xml¸ø²»Í¬Ç©ÃûµÄApp·ÖÅ䲻ͬµÄseinfo×Ö·û´®£¬ÀýÈ磬ÔÚAOSPÔ´Âë»·¾³Ï±àÒë²¢ÇÒʹÓÃÆ½Ì¨Ç©ÃûµÄApp»ñµÃµÄseinfoΪ¡°platform¡±£¬Ê¹ÓõÚÈý·½Ç©Ãû°²×°µÄApp»ñµÃµÄseinfoÇ©ÃûΪ"default"¡£
Õâ¸öseinfoÃèÊöµÄÊÇÆäʵ²¢²»Êǰ²È«ÉÏÏÂÎÄÖеÄType£¬ËüÊÇÓÃÀ´ÔÚÁíÍâÒ»¸öÎļþexternal/sepolicy/seapp_contextsÖвéÕÒ¶ÔÓ¦µÄTypeµÄ¡£Îļþexternal/sepolicy/seapp_contextsµÄÄÚÈÝÈçÏÂËùʾ£º
# Input selectors: # isSystemServer (boolean) # user (string) # seinfo (string) # name (string) # sebool (string) # isSystemServer=true can only be used once. # An unspecified isSystemServer defaults to false. # An unspecified string selector will match any value. # A user string selector that ends in * will perform a prefix match. # user=_app will match any regular app UID. # user=_isolated will match any isolated service UID. # All specified input selectors in an entry must match (i.e. logical AND). # Matching is case-insensitive. # Precedence rules: # (1) isSystemServer=true before isSystemServer=false. # (2) Specified user= string before unspecified user= string. # (3) Fixed user= string before user= prefix (i.e. ending in *). # (4) Longer user= prefix before shorter user= prefix. # (5) Specified seinfo= string before unspecified seinfo= string. # (6) Specified name= string before unspecified name= string. # (7) Specified sebool= string before unspecified sebool= string. # # Outputs: # domain (string) # type (string) # levelFrom (string; one of none, all, app, or user) # level (string) # Only entries that specify domain= will be used for app process labeling. # Only entries that specify type= will be used for app directory labeling. # levelFrom=user is only supported for _app or _isolated UIDs. # levelFrom=app or levelFrom=all is only supported for _app UIDs. # level may be used to specify a fixed level for any UID. # isSystemServer=true domain=system user=system domain=system_app type=system_data_file user=bluetooth domain=bluetooth type=bluetooth_data_file user=nfc domain=nfc type=nfc_data_file user=radio domain=radio type=radio_data_file user=_app domain=untrusted_app type=app_data_file levelFrom=none user=_app seinfo=platform domain=platform_app type=platform_app_data_file user=_app seinfo=shared domain=shared_app type=platform_app_data_file user=_app seinfo=media domain=media_app type=platform_app_data_file user=_app seinfo=release domain=release_app type=platform_app_data_file user=_isolated domain=isolated_app |
ÎļþÖеÄ×¢ÊͽâÊÍÁËÈçºÎÔÚÎļþseapp_contexts²éÕÒ¶ÔÏóµÄType£¬ÕâÀï²»ÔÙÀÛÊö£¬Ö»ÊǾÙÁ½¸öÀý×ÓÀ´ËµÃ÷¡£
´ÓÇ°ÃæµÄ·ÖÎö¿ÉÖª£¬¶ÔÓÚʹÓÃÆ½Ì¨Ç©ÃûµÄAppÀ´Ëµ£¬ËüµÄseinfoΪ¡°platform¡±¡£Óû§¿Õ¼äµÄSecurity
ServerÔÚΪËü²éÕÒ¶ÔÓ¦µÄTypeʱ£¬Ê¹ÓõÄuserÊäÈëΪ"_app"¡£ÕâÑùÔÚseapp_contextsÎļþÖУ¬ÓëËüÆ¥ÅäµÄÒ»Ðм´Îª£º
user=_app seinfo=platform domain=platform_app type=platform_app_data_file |
ÕâÑùÎÒÃǾͿÉÒÔÖªµÀ£¬Ê¹ÓÃÆ½Ì¨Ç©ÃûµÄAppËùÔËÐÐÔڵĽø³ÌdomainΪ¡°platform_app¡±£¬²¢ÇÒËüµÄÊý¾ÝÎļþµÄfile_typeΪ¡°platform_app_data_file¡±¡£
ÓÖÈ磬ʹÓõÚÈý·½Ç©ÃûµÄAppµÄseinfoΪ¡°default¡±¡£Óû§¿Õ¼äµÄSecurity ServerÔÚΪËü²éÕÒ¶ÔÓ¦µÄTypeʱ£¬Ê¹ÓõÄuserÊäÈëҲΪ"_app"¡£ÎÒÃÇ×¢Òâµ½£¬ÔÚseapp_contextsÎļþÖУ¬Ã»ÓÐÒ»ÐжÔÓ¦µÄuserºÍseinfo·Ö±ðΪ¡°_app¡±ºÍ¡°default¡±¡£µ«ÊÇÓÐÒ»ÐÐÊÇ×îÆ¥ÅäµÄ£¬¼´£º
user=_app domain=untrusted_app type=app_data_file levelFrom=none |
ÕâÑùÎÒÃǾͿÉÒÔÖªµÀ£¬Ê¹ÓõÚÈý·½Ç©ÃûµÄAppËùÔËÐÐÔڵĽø³ÌdomainΪ¡°unstrusted_app¡±£¬²¢ÇÒËüµÄÊý¾ÝÎļþµÄfile_typeΪ¡°app_data_file¡±¡£
½ÓÏÂÀ´ÎÒÃÇÔÙÀ´¿´ÏµÍ³ÎļþµÄ°²È«ÉÏÏÂÎÄÊÇÈçºÎ¶¨ÒåµÄ¡£Í¨¹ý²é¿´external/sepolicy/file_contextsÎļþ£¬ÎÒÃǾͿÉÒÔ¿´µ½ÏµÍ³ÎļþµÄ°²È«ÉÏÏÂÎÄÃèÊö£¬ÈçÏÂËùʾ£º
########################################### # Root / u:object_r:rootfs:s0 # Data files /adb_keys u:object_r:rootfs:s0 /default.prop u:object_r:rootfs:s0 /fstab\..* u:object_r:rootfs:s0 /init\..* u:object_r:rootfs:s0 /res(/.*)? u:object_r:rootfs:s0 /ueventd\..* u:object_r:rootfs:s0 # Executables /charger u:object_r:rootfs:s0 /init u:object_r:rootfs:s0 /sbin(/.*)? u:object_r:rootfs:s0 ...... ############################# # System files # /system(/.*)? u:object_r:system_file:s0 /system/bin/ash u:object_r:shell_exec:s0 /system/bin/mksh u:object_r:shell_exec:s0 ...... |
Îļþfile_contextsͨ¹ýÕýÔò±í´ïʽÀ´ÃèÊöϵͳÎļþµÄ°²È«ÉÏÏÂÎÄ¡£ÀýÈ磬ÔÚÉÏÃæÁгöµÄÄÚÈݵÄ×îºóÈýÐÐÖУ¬µ¹ÊýµÚÈýÐеÄÕýÔò±í´ïʽ±íʾÔÚ/systemĿ¼ÏµÄËùÓÐÎļþµÄ°²È«ÉÏÏÂÎľùΪ¡°u:object_r:system_file:s0¡±£¬×îºóÁ½ÐеÄÕýÔò±í´ïʽÔò±íʾÎļþ/system/bin/ashºÍ/system/bin/mkshµÄ°²È«ÉÏÏÂÎÄӦΪ¡°u:object_r:shell_exec:s0¡±¡£ËäÈ»µ¹ÊýµÚÈýÐеÄÕýÔò±í´ïʽÃèÊöµÄÎļþº¸ÇºóÃæÁ½¸öÕýÔò±í´ïʾÃèÊöµÄÎļþ£¬µ«ÊǺóÃæÁ½¸öÕýÔò±í´ïʽÃèÊöµÄ·½Ê½¸ü¼Ó¾ßÌ壬Òò´Ë/system/bin/ashºÍ/system/bin/mkshÁ½¸öÎļþµÄ×îÖÕ°²È«ÉÏÏÂÎͼ±»ÉèÖÃΪ¡°u:object_r:shell_exec:s0¡±¡£
ÔÚAndroidϵͳÖУ¬ÓÐÒ»ÖÖÌØÊâµÄ×ÊÔ´¡ª¡ªÊôÐÔ£¬Appͨ¹ý¶ÁдËüÃÇÄܹ»»ñµÃÏàÓ¦µÄÐÅÏ¢£¬ÒÔ¼°¿ØÖÆÏµÍ³µÄÐÐΪ£¬Òò´Ë£¬SEAndroidÒ²ÐèÒª¶ÔËüÃǽøÐб£»¤¡£ÕâÒâζ×ÅAndroidϵͳµÄÊôÐÔÒ²ÐèÒª¹ØÁªÓа²È«ÉÏÏÂÎÄ¡£ÕâÊÇͨ¹ýÎļþexternal/sepolicy/property_contextsÀ´ÃèÊöµÄ£¬ËüµÄÄÚÈÝÈçÏÂËùʾ£º
########################## # property service keys # # net.rmnet0 u:object_r:radio_prop:s0 net.gprs u:object_r:radio_prop:s0 net.ppp u:object_r:radio_prop:s0 net.qmi u:object_r:radio_prop:s0 net.lte u:object_r:radio_prop:s0 net.cdma u:object_r:radio_prop:s0 gsm. u:object_r:radio_prop:s0 persist.radio u:object_r:radio_prop:s0 net.dns u:object_r:radio_prop:s0 sys.usb.config u:object_r:radio_prop:s0 ...... |
ÊôÐԵݲȫÉÏÏÂÎÄÓëÎļþµÄ°²È«ÉÏÏÂÎÄÊÇÀàËÆµÄ£¬ËüÃǵÄSELinuxÓû§¡¢SELinux½ÇÉ«ºÍ°²È«¼¶±ð¾ù¶¨ÒåΪu¡¢object_rºÍs0¡£´ÓÉÏÃæÁгöµÄÄÚÈÝ¿ÉÒÔ¿´³ö£¬ÒÔnet.¿ªÍ·µÄ¼¸¸öÊôÐÔ£¬ÒÔ¼°ËùÓÐÒÔgsm.¿ªÍ·µÄÊôÐÔ¡¢persist.radioºÍsys.usb.configÊôÐԵݲȫÉÏÏÂÎľù±»ÉèÖÃΪ¡±u:object_r:radio_prop:s0¡°¡£ÕâÒâζ×ÅÖ»ÓÐÓÐȨÏÞ·ÃÎÊTypeΪradio_propµÄ×ÊÔ´µÄ½ø³Ì²Å¿ÉÒÔ·ÃÎÊÕâЩÊôÐÔ¡£
2. °²È«²ßÂÔ
ÉÏÃæÎÒÃÇ·ÖÎöÁËSEAndroid°²È«»úÖÆÖеĶÔÏó°²È«ÉÏÏÂÎÄ£¬½ÓÏÂÀ´ÎÒÃǾͼÌÐø·ÖÎöSEAndroid°²È«»úÖÆÖеݲȫ²ßÂÔ¡£SEAndroid°²È«»úÖÆÖеݲȫ²ßÂÔÊÇÔÚ°²È«ÉÏÏÂÎĵĻù´¡ÉϽøÐÐÃèÊöµÄ£¬Ò²¾ÍÊÇ˵£¬Ëüͨ¹ýÖ÷ÌåºÍ¿ÍÌåµÄ°²È«ÉÏÏÂÎÄ£¬¶¨ÒåÖ÷ÌåÊÇ·ñÓÐȨÏÞ·ÃÎÊ¿ÍÌå¡£
Ç°ÃæÌáµ½£¬SEAndroid°²È«»úÖÆÖ÷ÒªÊÇʹÓöÔÏó°²È«ÉÏÏÂÎÄÖеÄÀàÐÍÀ´¶¨Ò尲ȫ²ßÂÔ£¬ÕâÖÖ°²È«²ßÂԾͳÆType
Enforcement£¬¼ò³ÆTE¡£ÔÚexternal/sepolicyĿ¼ÖУ¬ËùÓÐÒÔ.teΪºó׺µÄÎļþ¾¹ý±àÒëÖ®ºó£¬¾Í»áÉú³ÉÒ»¸ösepolicyÎļþ¡£Õâ¸ösepolicyÎļþ»á´ò°üÔÚROMÖУ¬²¢ÇÒ±£´æÔÚÉ豸ÉϵĸùĿ¼Ï£¬¼´ËüÔÚÉ豸ÉϵÄ·¾¶Îª/sepolicy¡£
½ÓÏÂÀ´£¬ÎÒÃǾÍͨ¹ýapp.teÎļþµÄÄÚÈÝÀ´·ÖÎöSEAndroid°²È«»úÖÆÎªÊ¹Ê¹ÓÃÆ½Ì¨Ç©ÃûµÄAppËù¶¨ÒåµÄ°²È«²ßÂÔ£¬Ïà¹ØµÄÄÚÈÝÈçÏÂËùʾ£º
# # Apps signed with the platform key. # type platform_app, domain; permissive platform_app; app_domain(platform_app) platform_app_domain(platform_app) # Access the network. net_domain(platform_app) # Access bluetooth. bluetooth_domain(platform_app) unconfined_domain(platform_app) ...... |
Ç°ÃæÔÚ·ÖÎöseapp_contextsÎļþµÄʱºò£¬ÎÒÃÇÌáµ½£¬Ê¹ÓÃÆ½Ì¨Ç©ÃûµÄAppËùÔËÐÐÔڵĽø³ÌµÄdomainÖ¸¶¨Îª"platform_app"¡£´ÓÉÏÃæÁгöµÄÄÚÈÝ¿ÉÒÔ¿´³ö£¬platform_app½ÓÏÂÀ´»áͨ¹ýapp_domain¡¢platform_app_domain¡¢net_domain¡¢bluetooth_domainºÍunconfined_domainºê·Ö±ð¼ÓÈëµ½ÆäËüµÄdomainÖÐÈ¥£¬ÒÔ±ã¿ÉÒÔ»ñµÃÏàÓ¦µÄȨÏÞ¡£½ÓÏÂÀ´ÎÒÃǾÍÒÔunconfined_domainºêΪÀý£¬·ÖÎöplatform_app»ñµÃÁËÄÄЩȨÏÞ¡£
ºêunconfined_domain¶¨ÒåÔÚÎļþte_macrosÎļþÖУ¬ÈçÏÂËùʾ£º
...... ##################################### # unconfined_domain(domain) # Allow the specified domain to do anything. # define(`unconfined_domain', ` typeattribute $1 mlstrustedsubject; typeattribute $1 unconfineddomain; ') ...... |
$1ÒýÓõľÍÊÇunconfined_domainµÄ²ÎÊý£¬¼´platform_app¡£Í¨¹ý½ÓÏÂÀ´µÄÁ½¸ötypeattributeÓï¾ä£¬Îªplatform_appÉèÖÃÁËmlstrustedsubjectºÍunconfineddomainÁ½¸öÊôÐÔ¡£Ò²¾ÍÊÇ˵£¬mlstrustedsubjectºÍunconfineddomainÕâÁ½¸öType¾ßÓÐȨÏÞ£¬platform_appÕâ¸öTypeÒ²¾ßÓС£½ÓÏÂÀ´ÎÒÃÇÖ÷Òª·ÖÎöunconfineddomainÕâ¸öType¾ßÓÐÄÄЩȨÏÞ¡£
Îļþunconfined.te¶¨ÒåÁËunconfineddomainÕâ¸öTypeËù¾ßÓеÄȨÏÞ£¬ÈçÏÂËùʾ£º
allow unconfineddomain self:capability_class_set *; allow unconfineddomain kernel:security *; allow unconfineddomain kernel:system *; allow unconfineddomain self:memprotect *; allow unconfineddomain domain:process *; allow unconfineddomain domain:fd *; allow unconfineddomain domain:dir r_dir_perms; allow unconfineddomain domain:lnk_file r_file_perms; allow unconfineddomain domain:{ fifo_file file } rw_file_perms; allow unconfineddomain domain:socket_class_set *; allow unconfineddomain domain:ipc_class_set *; allow unconfineddomain domain:key *; allow unconfineddomain fs_type:filesystem *; allow unconfineddomain {fs_type dev_type file_type}:{ dir blk_file lnk_file sock_file fifo_file } *; allow unconfineddomain {fs_type dev_type file_type}:{ chr_file file } ~entrypoint; allow unconfineddomain node_type:node *; allow unconfineddomain node_type:{ tcp_socket udp_socket rawip_socket } node_bind; allow unconfineddomain netif_type:netif *; allow unconfineddomain port_type:socket_class_set name_bind; allow unconfineddomain port_type:{ tcp_socket dccp_socket } name_connect; allow unconfineddomain domain:peer recv; allow unconfineddomain domain:binder { call transfer set_context_mgr }; allow unconfineddomain property_type:property_service set; |
Ò»¸öTypeËù¾ßÓеÄȨÏÞÊÇͨ¹ýallowÓï¾äÀ´ÃèÊöµÄ£¬ÒÔÏÂÕâ¸öallowÓï¾ä£º
allow unconfineddomain domain:binder { call transfer set_context_mgr }; |
±íÃ÷domainΪunconfineddomainµÄ½ø³Ì¿ÉÒÔÓëÆäËü½ø³Ì½øÐÐbinder
ipcͨÐÅ£¨call£©£¬²¢ÇÒÄܹ»ÏòÕâЩ½ø³Ì´«µÝBinder¶ÔÏó£¨transfer£©£¬ÒÔ¼°½«×Ô¼ºÉèÖÃΪBinderÉÏÏÂÎĹÜÀíÆ÷£¨set_context_mgr£©¡£
×¢Ò⣬SEAndroidʹÓõÄÊÇ×îСȨÏÞÔÔò£¬Ò²¾ÍÊÇ˵£¬Ö»ÓÐͨ¹ýallowÓï¾äÉùÃ÷µÄȨÏÞ²ÅÊÇÔÊÐíµÄ£¬¶øÆäËüûÓÐͨ¹ýallowÓï¾äÉùÃ÷µÄȨÏÞ¶¼ÊǽûÖ¹£¬ÕâÑù¾Í¿ÉÒÔ×î´óÏ޶ȵر£»¤ÏµÍ³ÖеÄ×ÊÔ´¡£
Èç¹ûÎÒÃǼÌÐø·ÖÎöapp.teµÄÄÚÈÝ£¬»á·¢ÏÖʹÓõÚÈý·½Ç©ÃûµÄAppËùÔËÐÐÔڵĽø³ÌͬÑùÊǼÓÈëµ½unconfineddomainÕâ¸ödomainµÄ£¬ÈçÏÂËùʾ£º
# # Untrusted apps. # type untrusted_app, domain; permissive untrusted_app; app_domain(untrusted_app) net_domain(untrusted_app) bluetooth_domain(untrusted_app) unconfined_domain(untrusted_app) |
ÕâÊDz»ÊÇÒâζ×ÅʹÓÃÆ½Ì¨Ç©ÃûºÍµÚÈý·½Ç©ÃûµÄAppËù¾ßÓеÄȨÏÞ¶¼ÊÇÒ»ÑùµÄÄØ£¿´ð°¸ÊÇ·ñ¶¨µÄ¡£ËäȻʹÓÃÆ½Ì¨Ç©ÃûºÍµÚÈý·½Ç©ÃûµÄAppÔÚSEAndroid°²È«¿ò¼ÜµÄÔ¼ÊøÏ¶¼¾ßÓÐunconfineddomainÕâ¸ödomainËù¸³ÓèµÄȨÏÞ£¬µ«ÊDZðÍü¼Ç£¬ÔÚ½øÐÐSEAndroid°²È«¼ì²é֮ǰ£¬Ê¹ÓÃÆ½Ì¨Ç©ÃûºÍµÚÈý·½Ç©ÃûµÄAppÊ×ÏÈҪͨ¹ýDAC¼ì²é£¬Ò²¾ÍÊÇҪͨ¹ý´«Í³µÄLinux
UID/GID°²È«¼ì²é¡£ÓÉÓÚʹÓÃÆ½Ì¨Ç©ÃûºÍµÚÈý·½Ç©ÃûµÄAppÔÚ°²×°µÄʱºò·ÖÅäµ½µÄLinux UID/GIDÊDz»Ò»ÑùµÄ£¬Òò´Ë¾Í¾ö¶¨ÁËËüÃÇËù¾ßÓÐȨÏÞÊDz»Ò»ÑùµÄ¡£
ͬʱ£¬ÕâÀïʹÓÃÆ½Ì¨Ç©ÃûºÍµÚÈý·½Ç©ÃûµÄAppÖ®ËùÒÔ»áͬʱ±»¸³ÓèunconfineddomainÕâ¸ödomainµÄȨÏÞ£¬ÊÇÒòÎªÇ°ÃæÎÒÃÇ·ÖÎöµÄapp.teÎļþÊÇÀ´×ÔÓÚAndroid
4.3µÄ¡£ÔÚAndroid 4.3ÖУ¬SEAndroid°²È«»úÖÆÊÇÊÔÑéÐÔÖʵ쬲¢ÇÒÆôÓõÄÊÇPermissiveģʽ£¬Ò²¾ÍÊǼ´Ê¹Ö÷ÌåÎ¥·´Á˰²È«²ßÂÔ£¬Ò²Ö»Êǻᷢ³ö¾¯¸æ£¬¶ø²»»áÕæµÄ¾Ü¾øÖ´ÐС£Èç¹ûÎÒÃÇ·ÖÎöµÄÊÇAndroid
4.4µÄapp.teÎļþ£¬¾Í»á·¢ÏÖ£¬Ê¹ÓõÚÈý·½Ç©ÃûµÄApp²»ÔÙ¾ßÓд󲿷ÖunconfineddomainÕâ¸ödomainµÄȨÏÞ£¬ÒòΪAndroid
4.4µÄSEAndroid°²È«»úÖÆ²»ÔÙÊÇÊÔÑéÐÔÖʵ쬲¢ÇÒÆôÓõÄEnforcingģʽ¡£
ÒÔÉÏÃèÊöµÄ¾ÍÊÇ»ùÓÚTEµÄ°²È«²ßÂÔ£¬ËüµÄºËÐÄ˼Ïë¾ÍÊÇ×îСȨÏÞÔÔò£¬¼´Ö÷Ìå¶Ô¿ÍÌåÓµÓеÄȨÏÞ±ØÐëҪͨ¹ýallowÓï¾ä¶¨Òå²ÅÔÊÐí£¬·ñÔòµÄ»°£¬Ò»Çж¼ÊǽûÖ¹µÄ¡£
Ç°ÃæÎÒÃÇ»¹Ìáµ½£¬SEAndroid°²È«»úÖÆµÄ°²È«²ßÂÔ¾¹ý±àÒëºó»áµÃµ½Ò»¸ösepolicyÎļþ£¬²¢ÇÒ×îÖÕ±£´æÔÚÉ豸Éϵĸù¾ÝĿ¼Ï¡£×¢Ò⣬Èç¹ûÎÒÃÇʲôҲ²»×ö£¬ÄÇô±£´æÔÚÕâ¸ösepolicyÎļþÖеݲȫ²ßÂÔÊDz»»á×Ô¶¯¼ÓÔØµ½Äں˿ռäµÄSELinux
LSMÄ£¿éÈ¥µÄ¡£ËüÐèÒªÎÒÃÇÔÚϵͳÆô¶¯µÄ¹ý³ÌÖнøÐмÓÔØ¡£
ϵͳÖеÚÒ»¸öÆô¶¯µÄ½ø³ÌÊÇinit½ø³Ì¡£ÎÒÃÇÖªµÀ£¬Init½ø³ÌÔÚÆô¶¯µÄ¹ý³ÌÖУ¬Ö´ÐÐÁ˺ܶàµÄϵͳ³õʼ»¯¹¤×÷£¬ÆäÖоͰüÀ¨¼ÓÔØSEAndroid°²È«²ßÂԵŤ×÷£¬ÈçÏÂËùʾ£º
int main(int argc, char **argv) { ...... union selinux_callback cb; cb.func_log = klog_write; selinux_set_callback(SELINUX_CB_LOG, cb); cb.func_audit = audit_callback; selinux_set_callback(SELINUX_CB_AUDIT, cb); INFO("loading selinux policy\n"); if (selinux_enabled) { if (selinux_android_load_policy() < 0) { selinux_enabled = 0; INFO("SELinux: Disabled due to failed policy load\n"); } else { selinux_init_all_handles(); } } else { INFO("SELinux: Disabled by command line option\n"); } ...... } |
ÉÏÊö´úÂ붨ÒåÔÚÎļþsystem/core/init/init.cÖС£
ÕâÀïµ÷Óõ½ÁËÈý¸öÓëSEAndroidÏà¹ØµÄº¯Êý£ºselinux_set_callback¡¢selinux_android_load_policyºÍselinux_init_all_handles£¬ÆäÖУ¬selinux_set_callbackºÍselinux_android_load_policyÀ´×ÔÓÚlibselinux£¬¶øselinux_init_all_handlesÒ²ÊǶ¨ÒåÔÚÎļþsystem/core/init/init.cÖУ¬²¢ÇÒËü×îÖÕÒ²ÊÇͨ¹ýµ÷ÓÃlibselinuxµÄº¯ÊýÀ´´ò¿ªÇ°Ãæ·ÖÎöfile_contextsºÍproperty_contextsÎļþ£¬ÒÔ±ã¿ÉÒÔÓÃÀ´²éѯϵͳÎļþºÍϵͳÊôÐԵݲȫÉÏÏÂÎÄ¡£
º¯Êýselinux_set_callbackÓÃÀ´ÏòlibselinuxÉèÖÃSEAndroidÈÕÖ¾ºÍÉó¼Æ»Øµ÷º¯Êý£¬¶øº¯Êýselinux_android_load_policyÔòÊÇÓÃÀ´¼ÓÔØ°²È«²ßÂÔµ½Äں˿ռäµÄSELinux
LSMÄ£¿éÖÐÈ¥¡£ÎÒÃÇÖØµã¹Ø×¢º¯Êýselinux_android_load_policyµÄʵÏÖ¡£
º¯Êýselinux_android_load_policy¶¨ÒåÔÚÎļþexternal/libselinux/src/android.c£¬ËüµÄʵÏÖÈçÏÂËùʾ£º
int selinux_android_load_policy(void) { char *mnt = SELINUXMNT; int rc; rc = mount(SELINUXFS, mnt, SELINUXFS, 0, NULL); if (rc < 0) { if (errno == ENODEV) { /* SELinux not enabled in kernel */ return -1; } if (errno == ENOENT) { /* Fall back to legacy mountpoint. */ mnt = OLDSELINUXMNT; rc = mkdir(mnt, 0755); if (rc == -1 && errno != EEXIST) { selinux_log(SELINUX_ERROR,"SELinux: Could not mkdir: %s\n", strerror(errno)); return -1; } rc = mount(SELINUXFS, mnt, SELINUXFS, 0, NULL); } } if (rc < 0) { selinux_log(SELINUX_ERROR,"SELinux: Could not mount selinuxfs: %s\n", strerror(errno)); return -1; } set_selinuxmnt(mnt); return selinux_android_reload_policy(); } |
SELINUXMNT¡¢OLDSELINUXMNTºÍSELINUXFSÊÇÈý¸öºê£¬ËüÃǶ¨ÒåÔÚÎļþexternal/libselinux/src/policy.hÎļþÖУ¬ÈçÏÂËùʾ£º
/* Preferred selinuxfs mount point directory paths. */ #define SELINUXMNT "/sys/fs/selinux" #define OLDSELINUXMNT "/selinux" /* selinuxfs filesystem type string. */ #define SELINUXFS "selinuxfs" |
»Øµ½º¯Êýselinux_android_load_policyÖУ¬ÎÒÃDz»ÄÑ·¢ÏÖËüµÄʵÏÖÂß¼ÈçÏÂËùʾ£º
A. ÒÔ/sys/fs/selinuxΪ°²×°µã£¬°²×°Ò»¸öÀàÐÍΪselinuxfsµÄÎļþϵͳ£¬Ò²¾ÍÊÇSELinuxÎļþϵͳ£¬ÓÃÀ´ÓëÄں˿ռäµÄSELinux
LSMÄ£¿éͨÐÅ¡£
B. Èç¹û²»ÄÜÔÚ/sys/fs/selinuxÕâ¸ö°²×°µã°²×°SELinuxÎļþϵͳ£¬ÄÇôÔÙÒÔ/selinuxΪ°²×°µã£¬°²×°SELinuxÎļþϵͳ¡£
C. ³É¹¦°²×°SELinuxÎļþϵͳ֮ºó£¬½ÓÏÂÀ´¾Íµ÷ÓÃÁíÍâÒ»¸öº¯Êýselinux_android_reload_policyÀ´½«SEAndroid°²È«²ßÂÔ¼ÓÔØµ½Äں˿ռäµÄSELinux
LSMÄ£¿éÖÐÈ¥¡£
ÔڽϾɰ汾µÄLinuxϵͳÖУ¬SELinuxÎļþϵͳÊÇÒÔ/selinuxΪ°²×°µãµÄ£¬²»¹ýºóÃæ½Ïеİ汾¶¼ÊÇÒÔ/sys/fs/selinuxΪ°²×°µãµÄ£¬AndroidϵͳʹÓõÄÊǺóÕß¡£
º¯Êýselinux_android_reload_policyÒ²ÊǶ¨ÒåÔÚÎļþexternal/libselinux/src/android.cÖУ¬ËüµÄʵÏÖÈçÏÂËùʾ£º
static const char *const sepolicy_file[] = { "/data/security/current/sepolicy", "/sepolicy", 0 }; ...... int selinux_android_reload_policy(void) { int fd = -1, rc; struct stat sb; void *map = NULL; int i = 0; while (fd < 0 && sepolicy_file[i]) { fd = open(sepolicy_file[i], O_RDONLY | O_NOFOLLOW); i++; } if (fd < 0) { selinux_log(SELINUX_ERROR, "SELinux: Could not open sepolicy: %s\n", strerror(errno)); return -1; } if (fstat(fd, &sb) < 0) { selinux_log(SELINUX_ERROR, "SELinux: Could not stat %s: %s\n", sepolicy_file[i], strerror(errno)); close(fd); return -1; } map = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0); if (map == MAP_FAILED) { selinux_log(SELINUX_ERROR, "SELinux: Could not map %s: %s\n", sepolicy_file[i], strerror(errno)); close(fd); return -1; } rc = security_load_policy(map, sb.st_size); if (rc < 0) { selinux_log(SELINUX_ERROR, "SELinux: Could not load policy: %s\n", strerror(errno)); munmap(map, sb.st_size); close(fd); return -1; } munmap(map, sb.st_size); close(fd); selinux_log(SELINUX_INFO, "SELinux: Loaded policy from %s\n", sepolicy_file[i]); return 0; } |
º¯Êýselinux_android_reload_policyµÄÖ´Ðйý³ÌÈçÏÂËùʾ£º
A. ÒÀ´Î´Ó/data/security/currentºÍ¸ùĿ¼ѰÕÒsepolicyÎļþ£¬ÕÒµ½Ö®ºó¾Í´ò¿ª£¬»ñµÃÒ»¸öÎļþÃèÊö·ûfd¡£
B. ͨ¹ýÎļþÃèÊö·ûfd½«Ç°Ãæ´ò¿ªµÄsepolicyÎļþµÄÄÚÈÝÓ³Éäµ½ÄÚ´æÖÐÀ´£¬²¢Çҵõ½ËüµÄÆðʼµØÖ·Îªmap¡£
C. µ÷ÓÃÁíÍâÒ»¸öº¯Êýsecurity_load_policy½«ÒѾӳÉäµ½ÄÚ´æÖеÄsepolicyÎļþÄÚÈÝ£¬¼´SEAndroid°²È«²ßÂÔ£¬¼ÓÔØµ½Äں˿ռäµÄSELinux
LSMÄ£¿éÖÐÈ¥¡£
D. ¼ÓÔØÍê³Éºó£¬ÊÍ·ÅsepolicyÎļþÕ¼ÓõÄÄڴ棬²¢ÇҹرÕsepolicyÎļþ¡£
º¯Êýsecurity_load_policy¶¨ÒåÔÚÎļþexternal/libselinux/src/load_policy.cÖУ¬ËüµÄʵÏÖÈçÏÂËùʾ£º
int security_load_policy(void *data, size_t len) { char path[PATH_MAX]; int fd, ret; if (!selinux_mnt) {N errno = ENOENT; return -1; } snprintf(path, sizeof path, "%s/load", selinux_mnt); fd = open(path, O_RDWR); if (fd < 0) return -1; ret = write(fd, data, len); close(fd); if (ret < 0) return -1; return 0; } |
selinux_mntÊÇÒ»¸öÈ«¾Ö±äÁ¿£¬ËüÃèÊöµÄÊÇSELinuxÎļþϵͳµÄ°²×°µã¡£ÔÚÎÒÃÇÕâ¸öÇé¾°ÖУ¬ËüµÄÖµ¾ÍµÈÓÚ/sys/fs/selinux¡£
º¯Êýsecurity_load_policyµÄʵÏֺܼòµ¥£¬ËüÊ×ÏÈ´ò/sys/fs/selinux/loadÎļþ£¬È»ºó½«²ÎÊýdataËùÃèÊöµÄ°²È«²ßÂÔдÈëµ½Õâ¸öÎļþÖÐÈ¥¡£ÓÉÓÚ/sys/fs/selinuxÊÇÓÉÄں˿ռäµÄSELinux
LSMÄ£¿éµ¼³öÀ´µÄÎļþϵͳ½Ó¿Ú£¬Òò´Ëµ±ÎÒÃǽ«°²È«²ßÂÔдÈ뵽λÓÚ¸ÃÎļþϵͳÖеÄloadÎļþʱ£¬¾ÍÏ൱ÓÚÊǽ«°²È«²ßÂÔ´ÓÓû§¿Õ¼ä¼ÓÔØµ½SELinux
LSMÄ£¿éÖÐÈ¥ÁË¡£ÒÔºóSELinux LSMÄ£¿éÖеÄSecurity Server¾Í¿ÉÒÔͨ¹ýËüÀ´½øÐа²È«¼ì²é¡£
3. Security Server
Óû§¿Õ¼äµÄSecurity ServerÖ÷ÒªÊÇÓÃÀ´±£»¤Óû§¿Õ¼ä×ÊÔ´µÄ£¬ÒÔ¼°ÓÃÀ´²Ù×÷Äں˿ռä¶ÔÏóµÄ°²È«ÉÏÏÂÎĵģ¬ËüÓÉÓ¦ÓóÌÐò°²×°·þÎñPackageManagerService¡¢Ó¦ÓóÌÐò°²×°ÊØ»¤½ø³Ìinstalld¡¢Ó¦ÓóÌÐò½ø³Ì·õ»¯Æ÷Zygote½ø³ÌÒÔ¼°init½ø³Ì×é³É¡£ÆäÖУ¬PackageManagerServiceºÍinstalld¸ºÔð´´½¨AppÊý¾ÝĿ¼µÄ°²È«ÉÏÏÂÎÄ£¬Zygote½ø³Ì¸ºÔð´´½¨App½ø³ÌµÄ°²È«ÉÏÏÂÎÄ£¬¶øinit½ø³Ì¸ºÔð¿ØÖÆÏµÍ³ÊôÐԵݲȫ·ÃÎÊ¡£
Ó¦ÓóÌÐò°²×°·þÎñPackageManagerServiceÔÚÆô¶¯µÄʱºò£¬»áÔÚ/etc/securityĿ¼ÖÐÕÒµ½ÎÒÃÇÇ°Ãæ·ÖÎöµÄmac_permissions.xmlÎļþ£¬È»ºó¶ÔËü½øÐнâÎö£¬µÃµ½AppÇ©Ãû»òÕß°üÃûÓëseinfoµÄ¶ÔÓ¦¹ØÏµ¡£µ±PackageManagerService°²×°AppµÄʱºò£¬Ëü¾Í»á¸ù¾ÝÆäÇ©Ãû»òÕß°üÃû²éÕÒµ½¶ÔÓ¦µÄseinfo£¬²¢ÇÒ½«Õâ¸öseinfo´«µÝ¸øÁíÍâÒ»¸öÊØ»¤½ø³Ìinstalled¡£
ÊØ»¤½ø³Ìinstalld¸ºÔð´´½¨AppÊý¾ÝĿ¼¡£ÔÚ´´½¨AppÊý¾ÝĿ¼µÄʱºò£¬ÐèÒª¸øËüÉèÖð²È«ÉÏÏÂÎÄ£¬Ê¹µÃSEAndroid°²È«»úÖÆ¿ÉÒÔ¶ÔËü½øÐа²È«·ÃÎÊ¿ØÖÆ¡£Installd¸ù¾ÝPackageManagerService´«µÝ¹ýÀ´µÄseinfo£¬²¢ÇÒµ÷ÓÃlibselinux¿âÌṩµÄselabel_lookupº¯Êýµ½Ç°ÃæÎÒÃÇ·ÖÎöµÄseapp_contextsÎļþÖвéÕÒµ½¶ÔÓ¦µÄType¡£ÓÐÁËÕâ¸öTypeÖ®ºó£¬installd¾Í¿ÉÒÔ¸øÕýÔÚ°²×°µÄAppµÄÊý¾ÝĿ¼ÉèÖð²È«ÉÏÏÂÎÄÁË£¬ÕâÊÇͨ¹ýµ÷ÓÃlibselinux¿âÌṩµÄlsetfileconº¯ÊýÀ´ÊµÏֵġ£
´ÓÇ°ÃæAndroidÓ¦ÓóÌÐò½ø³ÌÆô¶¯¹ý³ÌµÄÔ´´úÂë·ÖÎöºÍAndroidϵͳ½ø³ÌZygoteÆô¶¯¹ý³ÌµÄÔ´´úÂë·ÖÎöÕâÁ½ÆªÎÄÕ¿ÉÒÔÖªµÀ£¬ÔÚAndroidϵͳÖУ¬Zygote½ø³Ì¸ºÔð´´½¨Ó¦ÓóÌÐò½ø³Ì¡£Ó¦ÓóÌÐò½ø³ÌÊÇSEAndroid°²È«»úÖÆÖеÄÖ÷Ì壬Òò´ËËüÃÇÒ²ÐèÒªÉèÖð²È«ÉÏÏÂÎÄ£¬ÕâÊÇÓÉZygote½ø³ÌÀ´ÉèÖõġ£×é¼þ¹ÜÀí·þÎñActivityManagerServiceÔÚÇëÇóZygote½ø³Ì´´½¨Ó¦ÓóÌÐò½ø³Ì֮ǰ£¬»áµ½PackageManagerServiceÖÐÈ¥²éѯ¶ÔÓ¦µÄseinfo£¬²¢ÇÒ½«Õâ¸öseinfo´«µÝµ½Zygote½ø³Ì¡£ÓÚÊÇ£¬Zygote½ø³ÌÔÚforkÒ»¸öÓ¦ÓóÌÐò½ø³ÌÖ®ºó£¬¾Í»áʹÓÃActivityManagerService´«µÝ¹ýÀ´µÄseinfo£¬²¢ÇÒµ÷ÓÃlibselinux¿âÌṩµÄselabel_lookupº¯Êýµ½Ç°ÃæÎÒÃÇ·ÖÎöµÄseapp_contextsÎļþÖвéÕÒµ½¶ÔÓ¦µÄDomain¡£ÓÐÁËÕâ¸öDomainÖ®ºó£¬Zygote½ø³Ì¾Í¿ÉÒÔ¸ø¸Õ²Å´´½¨µÄÓ¦ÓóÌÐò½ø³ÌÉèÖð²È«ÉÏÏÂÎÄÁË£¬ÕâÊÇͨ¹ýµ÷ÓÃlibselinux¿âÌṩµÄlsetconº¯ÊýÀ´ÊµÏֵġ£
Ç°ÃæÌáµ½£¬ÔÚAndroidϵͳÖУ¬ÊôÐÔÒ²ÊÇÒ»ÏîÐèÒª±£»¤µÄ×ÊÔ´¡£Init½ø³ÌÔÚÆô¶¯µÄʱºò£¬»á´´½¨Ò»¿éÄÚ´æÇøÓòÀ´Î¬»¤ÏµÍ³ÖеÄÊôÐÔ£¬½Ó×Å»¹»á´´½¨Ò»¸öProperty·þÎñ¡£Õâ¸öProperty·þÎñͨ¹ýsocketÌṩ½Ó¿Ú¸øÆäËü½ø³Ì·ÃÎÊAndroidϵͳÖеÄÊôÐÔ¡£ÆäËü½ø³Ìͨ¹ýsocketÀ´ºÍProperty·þÎñͨÐÅʱ£¬Property·þÎñ¿ÉÒÔ»ñµÃËüµÄ°²È«ÉÏÏÂÎÄ¡£ÓÐÁËÕâ¸ö°²È«ÉÏÏÂÎÄÖ®ºó£¬Property·þÎñ¾Í¿ÉÒÔͨ¹ýlibselinux¿âÌṩµÄselabel_lookupº¯Êýµ½Ç°ÃæÎÒÃÇ·ÖÎöµÄproperty_contextsÈ¥²éÕÒÒª·ÃÎʵÄÊôÐԵݲȫÉÏÏÂÎÄÁË¡£ÓÐÁËÕâÁ½¸ö°²È«ÉÏÏÂÎÄÖ®ºó£¬Property·þÎñ¾Í¿ÉÒÔ¾ö¶¨ÊÇ·ñÔÊÐíÒ»¸ö½ø³Ì·ÃÎÊËüËùÖ¸¶¨µÄÊôÐÔÁË¡£
ÖÁ´Ë£¬ÎÒÃǾͷÖÎöÍê³ÉSEAndroid°²È«»úÖÆµÄÕûÌå¿ò¼ÜÁË¡£ÓÐÁËÕâЩ»ù´¡ÖªÊ¶Ö®ºó£¬½ÓÏÂÀ´ÎÒÃǾͿÉÒÔ¸ü¼ÓÉîÈëµØÈ¥·ÖÎöһЩ¾ßÌåµÄʹÓÃÇé¾°ÁË¡£ÀýÈ磬ÎÒÃÇÇ°Ãæ½éÉܵÄÓû§¿Õ¼äµÄSecurity
ServerÊÇÈçºÎÒ»²½Ò»²½µØÉèÖÃÓ¦ÓóÌÐòÊý¾ÝĿ¼ºÍÓ¦ÓóÌÐò½ø³ÌµÄ°²È«ÉÏÏÂÎĵģ¬ÒÔ¼°Init½ø³ÌÊÇÈçºÎ¿ØÖÆÏµÍ³ÖеÄÊôÐÔ·ÃÎʵ쬾´Çë¹Ø×¢£¡ |