UbuntuÄÚºËOverlayFSȨÏÞÌÓÒÝ·ì϶·ÖÎö£¨CVE-2021-3493£©

°ä²¼¹¦·ò 2021-04-29

±³  ¾°


ƾ¾Ý¹Ù·½½éÉÜ  £¬OverlayFs·ì϶ÔÊÐíUbuntuϵı¾µØÓû§»ñµÃrootȨÏÞ ¡£Õâ¸ö·ì϶ÊÇUbuntuϵͳÖеÄÌØ¶¨ÎÊÌâ  £¬ÔÚ¸ÃÎÊÌâÖÐ  £¬Î´ÕýÈ·ÑéÖ¤¹ØÓÚÓû§namespaceÎļþϵͳְÄܵÄÀûÓ÷¨Ê½ ¡£ÓÉÓÚUbuntu¸½´øÁËÒ»¸öÔÊÐí·ÇÌØÈ¨µÄOverlayfs¹ÒÔØµÄ²¹¶¡  £¬½áºÏÕâ¸ö²¹¶¡¹ÒÔØOverlayfsÄܹ»È¨ÏÞÌÓÒÝ  £¬´ïµ½È¨ÏÞÌáÉýµÄÖ÷ÕÅ ¡£


Ó°Ïì°æ±¾


Ubuntu 20.10

Ubuntu 20.04 LTS

Ubuntu 18.04 LTS

Ubuntu 16.04 LTS

Ubuntu 14.04 ESM


·ì϶¸´ÏÖ


Ê×ÏȲ鿴Äں˰汾  £¬ÎªÊÜÓ°Ïì°æ±¾±àÒëexploitºóÖ´ÐÐ  £¬ÌáȨ³É¹¦ ¡£ÈçÏÂͼËùʾ£º


1.jpg


ÓйؽéÉÜ


£¨1£©Ðé¹¹Îļþϵͳ

Ϊ֧³Ö¸÷Àà±¾»úÎļþϵͳ  £¬ÇÒÔÚͬʱÔÊÐí½Ó¼ûÆäËû²Ù×÷ϵͳµÄÎļþ  £¬LinuxÄÚºËÔÚÓû§¹ý³Ì£¨»òC³ß¶È¿â£©ºÍÎļþϵͳʵÏÖÖ®¼äÒýÈëÁËÒ»¸ö³éÏó²ã ¡£¸Ã³éÏó²ã³ÆÖ®ÎªÐé¹¹Îļþϵͳ£¨Virtual File System£©¼ò³ÆVFS  £¬ÈçÏÂͼËùʾ£º


2.jpg


VFSΪËùÓеÄÎļþϵͳÌṩÁËͳһµÄ½Ó¿Ú  £¬¶Ôÿ¸ö¾ßÌåÎļþϵͳµÄ½Ó¼ûҪͨ¹ýVFS½ç˵µÄ½Ó¿ÚÀ´ÊµÏÖ ¡£VFS³éÏóÁ˼¸¸ö³ÁÒªµÄ½á¹¹£ºsuper_block  £¬dentry  £¬inode  £¬file  £¬Í¨¹ýÕâЩ½á¹¹½«Ò»¸öÕæÊµµÄÎļþϵͳ³éÏóµ½ÄÚ´æÖÐ  £¬´Ó¶øÍ¨¹ýÖÎÀíÕâЩ¶ÔÏó¶ÔÎļþϵͳ½øÐвÙ×÷ ¡£


£¨2£©OverlayÎļþϵͳ

OverlayFSÊÇÒ»¸öÃæÏòLinuxµÄÎļþϵͳ·þÎñ  £¬ÆäʵÏÖÒ»¸öÃæÏòÆäËûÎļþϵͳµÄ½áºÏ¹ÒÔØ ¡£ËüÓÚ2014Äê±»¹é²¢µ½LinuxÄں˵Ä3.18°æ±¾ ¡£OverlayFSµÄÖØÒª»úÔìÉæ¼°µ½Á½¸öÎļþϵͳ  £¬ÌṩͳһÃû³ÆµÄĿ¼ʱ  £¬Ä¿Â¼½Ó¼û¹é²¢ ¡£³ý´ËÖ®±í  £¬OverlayFS³ÊÏÔìäÖÐÒ»¸öËù²úÉúµÄ¶ÔÏó  £¬¡°Éϲ㡱ÎļþϵͳÓÅÏÈ ¡£OverlayFSÓëÆäËû¸²¸ÇÐÍÎļþϵͳ·ÖÆç  £¬OverlayFS¹é²¢µÄĿ¼×ÓÊ÷²»Ô¸¶¨ÊÇÀ´×Ô·ÖÆçµÄÎļþϵͳ ¡£³ÉЧÈçÏÂͼËùʾ£º


3.jpg


Æä¹ÒÔØÎļþµÄ¸ù»ùºÅÁîÈçÏ£º

mount -t overlay overlay -o lowerdir=lower1:lower2:lower3,upperdir=upper,workdir=work merged ¡£


ÆäÖÓ×°lower1:lower2:lower3¡±°µÊ¾·ÖÆçµÄlower²ãĿ¼  £¬·ÖÆçµÄĿ¼ʹÓá°:¡±·Ö¸ô  £¬µµ´Î¹ØÏµË³´ÎΪlower1 > lower2 > lower3£¨×¢£º¶àlower²ãÖ°ÄÜÖ§³ÖÔÚLinux-4.0ºÏÈë  £¬Linux-3.18°æ±¾Ö»ÄÜÖ¸¶¨Ò»¸ölower dir£©,¶øºóupperºÍworkĿ¼±ðÀ밵ʾ£ºupper²ãĿ¼ºÍÎļþϵͳ¹ÒÔØºó  £¬ÓÃÓÚ´æ·ÅһʱºÍ¼ä½ÓÎļþµÄ¹¤×÷»ùĿ¼£¨work base dir£©  £¬×îºóµÄmergedĿ¼¾ÍÊÇ×îÖյĹÒÔØµãĿ¼ ¡£ÈôËùÓÐ˳Àû  £¬ÔÚÖ´ÐÐÒÔÉϺÅÁîºó  £¬overlayfs¾Í³É¹¦¹ÒÔØµ½mergedĿ¼ÏÂÁË ¡£


£¨3£©capabilitiy

ΪÁ˽øÐÐȨÏ޲鳭  £¬Linuxϵͳ½«¹ý³Ì·ÖΪÁËÁ½Àࣺprivileged¹ý³Ì£¨effective UIDΪ0£©ºÍ unprivileged ¹ý³Ì£¨effective UIDΪ·Ç0£© ¡£privileged¹ý³ÌÄܹ»ÈƹýËùÓеÄÄÚºËȨÏ޲鳭  £¬¶øunprivileged ¹ý³ÌÒª½øÐÐÑϸñµÄȨÏ޲鳭 ¡£´Ó2.2°æ±¾µÄÄÚºËÆðÍ·  £¬linux¶ÔȨÏÞ½øÐÐÁËϸ·Ö  £¬·ÖΪ¶àÖÖ·ÖÆçµÄȨÏÞ  £¬³ÆÖ®Îªcapability ¡£capabilityÄܹ»×÷ÓÃÔÚ¹ý³ÌÉÏ  £¬Ò²Äܹ»×÷ÓÃÔÚ·¨Ê½ÎļþÉÏ ¡£Ä¿Ç°  £¬LinuxϵͳÉÏʵÏÖÁË37ÖÖcapability ¡£


ÿ¸ö¹ý³Ì¶¼ÓÐÎå¸öcapability¼¯ÖУºPermitted  £¬Inheritable  £¬Effective  £¬Ambient  £¬Bounding ¡£ÎļþµÄcapability±£ÁôÔÚÎļþµÄÀ©´óÊôÐÔsecurity.capabilityÖÐ ¡£ÎļþÓÐÈý¸öcapabilitiy¼¯ÖУºPermitted  £¬Inheritable  £¬Effective ¡£ÎļþµÄcapabilityºÍ¹ý³ÌµÄcapabilityһ·À´¾ö¶¨ÔÚÖ´ÐÐexecveºó  £¬¹ý³ÌµÄcapability ¡£


·ì϶µÀÀí


£¨1£©OverlayFS¹ÒÔØ

ͨ³£Çé¿öÏ  £¬¹ÒÔØÎļþϵͳÊDZØÒªÌØÈ¨µÄ  £¬µ«ÊÇÔÚUbuntuϵͳÖÐ  £¬Í¨³£Óû§±ãÄܹ»¹ÒÔØOverlayFS ¡£ÒÔ5.4.0°æ±¾ÄÚºËÖ÷Ïß´úÂëΪÀý  £¬ovl_fs_type½á¹¹Ìå½ç˵ÈçÏÂͼËùʾ£º

 

4.jpg


ÒÔUbuntu20.04µÄÄں˲¹¶¡linux_5.4.0-26.30.diffΪÀý  £¬²¹¶¡ÈçÏÂͼËùʾ£º

 

5.jpg


Ôö³¤ÁËfs_flagsÊý¾ÝÓò  £¬²¢ÉèÖÃΪFS_USERNS_MOUNT  £¬°µÊ¾½«ÔÊÐíÒ»¸öͨ³£Óû§ÔÚµÍȨÏÞÓû§¶¨Ãû¿Õ¼äÖÐmoutÒ»¸öoverlayfsÎļþϵͳ ¡£µ±È¥mountÒ»¸öoverlayfsÎļþϵͳʱ  £¬Å²ÓÃõè¾¶ÈçÏÂͼËùʾ£º


6.jpg


»áŲÓõ½do_new_mount()º¯Êý  £¬¸Ãº¯ÊýÊÇ´´½¨Ò»¸öеÄmount  £¬²¢½«Æä·ÅÈënamespaceÊ÷ÖÐ  £¬ÊµÏÖ´úÂëÈçÏÂͼËùʾ£º


7.jpg


ÐÐ2792  £¬»ñȡҪ¹ÒÔØµÄÎļþϵͳÀàÐÍ  £¬ÕâÀïÊÇoverlay ¡£¶øºó¾ÍÊǽøÐÐcapabilitiyУÑé  £¬ÈçÏÂͼËùʾ£º


8.jpg


ÓÉÓÚfs_flags±»ÉèÖÃΪFS_USERNS_MOUNT  £¬½øÈëns_capable()º¯Êý  £¬×îºóͨ¹ý¼ìÑéºó  £¬ÈçÏÂͼËùʾ£º


9.jpg


²¢ÇÒÉèÖÃcurrent->flagsΪPF_SUPERPRIV  £¬¼´ÔÚµ±Ç°¹ý³ÌÉÏÉèÖó¬µÈȨÏÞ  £¬²¢·µ»Øture ¡£ËùÒÔͨ¹ý¹ÒÔØoverlayÎļþϵͳ  £¬µ±Ç°¹ý³Ì¾ß±¸Á˳¬µÈȨÏÞ ¡£


 £¨2£©È¨ÏÞÌÓÒÝ

¸Ã·ì϶ÊÇÔÚsetxattr()º¯ÊýÖвúÉúµÄ  £¬µ±¶ÔÎļþÀ©´óÊôÐÔµÄcapabilitiy½øÐÐÉèÖÃʱ  £¬È¨ÏÞУÑé²»³¹µ× ¡£ÏÂÃæÊÇ"SSD Secure Disclosure"Åû¶µÄExpÖ´ÐÐÇé¿ö  £¬Å²ÓÃõè¾¶ÈçÏÂͼËùʾ£º


10.jpg


ÕâÀïpathnameΪ¡°./ovlcap/merge/magic¡±  £¬ÐÐ468  £¬Å²ÓÃcap_convert_nscap()º¯Êý  £¬½«ÒªÉèÖõÄcapת»»µ½nscapÖÐ  £¬ÈçÏÂͼËùʾ£º


11.jpg


½øÈëcap_convert_nscap()º¯Êý  £¬½øÐÐÓйؼì²âºó  £¬ÈôÊÇÊÇcapabilitiy°æ±¾2  £¬ÔòÖ±½ÓŲÓÃns_capable()½øÐмìÑé  £¬Æ¾¾Ý×¢½â¿ÉÖª  £¬ÈôÊÇuserÓ㬵ÈȨÏÞ  £¬Ö±½ÓдÈë²¢·µ»Ø ¡£


12.jpg


ºÁÎÞÒÉÄÑ  £¬ÕâÀï×¢¶¨ÊǼìÑéͨ¹ýµÄ ¡£´òÓ¡¹Ø¼üÄÚ´æ  £¬ÈçÏÂͼËùʾ£º


13.jpg


¼Ä·ÅÆ÷raxΪ0x1  £¬°µÊ¾·µ»Øture ¡£ÓÉÓÚµ±Ç°½Ó¼ûµÄinodeÊôÓÚoverlayÎļþϵͳµÄ ¡£´Ócap_convert_nscap()º¯ÊýÕýÈ··µ»Øºó  £¬Ëæ¼´½øÈëvfs_setxattr()º¯Êý  £¬ÕâÊǵÚÒ»´Î½øÈë ¡£½ÓÏÂÀ´¾ÍÊÇ·Ö·¢µ½overlayÎļþϵͳ¶ÔÓ¦µÄovl_xattr_set()º¯ÊýÖÐ  £¬Å²ÓÃõè¾¶ÈçÏÂͼËùʾ£º


14.jpg


¿´ovl_xattr_set()º¯ÊýµÄ²¿ÃÅʵÏÖ´úÂë  £¬»ñÈ¡upperdentryºÍrealdentry  £¬ÈçÏÂͼËùʾ£º


15.jpg


»ñÈ¡ºó  £¬´òÓ¡upperdentryºÍrealdentryÄÚ´æ  £¬ÈçÏÂͼËùʾ£º


16.jpg


ƾ¾ÝoverlayÎļþϵͳ¸öÐÔ  £¬ÕâÀïµÄupperdentryºÍrealdentryÓ¦¸ÃÊÇ¡°./ovlcap/upper¡±Ä¿Â¼ÏµÄmagicµÄĿ¼Ïî  £¬´òÓ¡ÄÚ´æ¿ÉÖª  £¬ÈçÏÂͼËùʾ£º


17.jpg


È·¶¨ÕæÊµµÄdentryºó  £¬µÚ¶þ´ÎŲÓÃvfs_setxattr()º¯Êý  £¬ÈçÏÂͼËùʾ£º


18.jpg


´ËʱµÄdentryÊÇÊôÓÚext3ÎļþϵͳµÄ  £¬´òÓ¡ÄÚ´æ¿ÉÖª  £¬ÈçÏÂͼËùʾ£º


19.jpg


µ½´Ë¿ÉÖª  £¬ÏÖʵÉÏÊǶÔext3Îļþϵͳϵġ°./ovlcap/upper/magic¡±½øÐÐÉèÖÃcap ¡£È¨ÏÞÌÓÒݹý³ÌÈçÏÂͼËùʾ£º


20.jpg


·ì϶ÀûÓ÷ÖÎö


"SSD Secure Disclosure"¹Ù·½ÒѾ­Åû¶ÁËÓйØExp  £¬¾ßÌå·ÖÎöÈçÏ£º

 

21.jpg


ÕâÀï½ç˵ºóÃæ¹ÒÔØoverlayÎļþϵͳµÄÎļþ¼ÐÃû³Æ:


22.jpg


²¢×Ô½ç˵xmkdirº¯Êý´´½¨ÕâЩÎļþ¼Ð:


23.jpg


¶øºó»ñÈ¡µ±Ç°Óû§µÄuidºÍgid£º

 

24.png


´´½¨ÐµÄuser namespace  £¬ÓÉÓÚoverlayfs mount±ØÒªCAP_SYS_MOUNTÄÜÁ¦  £¬Òò¶ø±ØÒªÐ½¨Ò»¸öNEWUSERµÄnamespace  £¬ÕâÑù¾ÍÓµÓÐCAP_SYS_MOUNT  £¬


25.jpg


CLONE_NEWNSºÍCLONE_NEWUSER½ç˵£º


26.jpg


Óõ±Ç°Óû§µÄuidºÍgidµÈ¸Äд/proc/selfϵĶÔÓ¦Îļþ  £¬²¢ÇÒÓøÃȨÏÞϵÄnamespace¹ÒÔØoverlayfs  £¬Ç°Ãæ¼ò½é˵ÁË  £¬ÓÉÓÚubuntuµÄ²¹¶¡´æÔÚ  £¬¸Ã²Ù×÷ÊǺϷ¨µÄ ¡£


27.jpg


 ¶ÔӦĿ¼ÏÂÄܹ»¿´µ½ÎÒÃÇÅú¸ÄÁ˵ÄÎļþ  £¬Í¨¹ý/proc/self/exeÄܹ»ÕÒµ½µ±Ç°¹ý³ÌµÄ¶þ½øÔìʵÌ壨Îļþ£©£º


28.jpg


³ÖÐø»Øµ½expÖÐ  £¬ÏÂÃæ»ú¹ØÁËÒ»¸öcap  £¬¸Äcap½ç˵µÄpermittedΪ0xffffffff  £¬²¢ÇÒ¿ªÆôEffective  £¬¶øºó½«/proc/selfϵÄÎļþ¿½±´µ½mergeÎļþ¼ÐÏ  £¬Æ¾¾ÝoverlayÎļþϵͳ¸öÐÔ  £¬Õâ¸ö¿½±´¹ý³ÌÏÖʵÊÇ´´½¨./ovlcap/upper/magicÎļþ  £¬×îºóŲÓÃsetxattr()º¯Êý  £¬½«capÉèÖõ½./ovlcap/merge/magicÉÏÃæ ¡£


29.jpg


ƾ¾ÝǰÎÄ·ì϶µÀÀí½éÉÜ  £¬È¨ÏÞÌÓÒݺó  £¬´ËʱÊôÓÚext3ÎļþϵͳµÄ./ovlcap/upper/magicÎļþµÄcapabilitiyΪall+ep  £¬±ãÄܹ»ÀûÓÃcapabilitiy½øÐÐȨÏÞÌáÉý  £¬½Ó×ÅÆô¶¯./ovlcap/upper/magic¹ý³Ì  £¬¸Ã¹ý³ÌµÄcapabilitiyÒѾ߱¸all+ep  £¬¶øºó½øÐÐsetuid(0)ºÍsetgid(0)ÌáȨ²Ù×÷  £¬ÕâÊDZ»ÔÊÐíµÄ ¡£


30.jpg


²¹¶¡¸ú×Ù


·ì϶³ÉÒòÔÚÉÏÃæÒѾ­½éÉÜÁË  £¬ÕâÀïµÄ²¹¶¡Ò²ºÜ³¹µ×  £¬½«cap_convert_nscap·ÅÈëÁËvfs_setxattrÖÐ  £¬¼´Ã¿´Î½øÈëvfs_setxattr()º¯Êýʱ  £¬¶¼ÏȽøÐÐȨÏÞУÑé  £¬ÅжÏcapabilitiyºÍ¶¨Ãû¿Õ¼äµÄȨÏÞÊÇ·ñÆ¥Åä ¡£


31.jpg


²Î¿¼Á´½Ó£º

[1] https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2021-3493

[2] https://access.redhat.com/security/cve/cve-2021-3493
[3] https://ubuntu.com/security/CVE-2021-3493
[4] https://github.com/briskets/CVE-2021-3493
[5] https://cve.report/CVE-2021-3493.pdf
[6] https://blog.csdn.net/qq_15770331/article/details/96699386
[7] https://lwn.net/Articles/671641/
[8] https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1793458/comments/4
[9] https://git.launchpad.net/~ubuntu-kernel/ubuntu/+source/linux/+git/xenial/commit/?id=98a3740920f8f3362c1ac50598af2dc632f5051a


GA»Æ½ð¼×»ý¼«·ÀÓù³¢ÊÔÊÒ£¨ADLab£©


ADLab³ÉÁ¢ÓÚ1999Äê  £¬ÊÇÖйú°²È«ÐÐÒµ×îÔç³ÉÁ¢µÄ¹¥·À¼¼Êõ×êÑг¢ÊÔÊÒÖ®Ò»  £¬Î¢ÈíMAPP´òËãÖ÷Ìâ³ÉÔ±  £¬¡°ºÚȸ¹¥»÷¡±¸ÅÏëÊ×ÍÆÕß ¡£½ØÖ¹Ä¿Ç°  £¬ADLabÒÑͨ¹ýCVEÀۼư䲼°²È«·ì϶½ü1100¸ö  £¬Í¨¹ý CNVD/CNNVDÀۼư䲼°²È«·ì϶1000Óà¸ö  £¬³ÖÐøÎ¬³Ö¹ú¼ÊÍøÂ簲ȫÁìÓòÒ»Á÷Ë®×¼ ¡£³¢ÊÔÊÒ×êÑз½Ïòº­¸Ç²Ù×÷ϵͳÓëÀûÓÃϵͳ°²È«×êÑÓ×¢ÖÇÄÜÖն˰²È«×êÑÓ×¢ÎïÁªÍøÖÇÄÜÉ豸°²È«×êÑÓ×¢Web°²È«×êÑÓ×¢¹¤¿ØÏµÍ³°²È«×êÑÓ×¢ÔÆ°²È«×êÑÐ ¡£×êÑгɾÍÀûÓÃÓÚ²úÆ·Ö÷Ìâ¼¼Êõ×êÑÓ×¢¹ú¶È³Áµã¿Æ¼¼ÏîÄ¿¹¥¹Ø¡¢×¨Òµ°²È«·þÎñµÈ ¡£


adlab.jpg