Linux£¬×÷Ϊ¿ªÔ´²Ù×÷ϵͳµÄµä·¶£¬Æ¾½èÆä¸ß¶ÈµÄÁé»îÐÔ¡¢Îȶ¨ÐÔºÍÇ¿´óµÄÉçÇøÖ§³Ö£¬ÔÚ·þÎñÆ÷¡¢Ç¶Èëʽϵͳ¡¢ÔƼÆËãµÈ¶à¸öÁìÓòÕ¼¾ÝÖ÷µ¼µØÎ»
È»¶ø£¬Ëæ×ÅLinuxϵͳµÄ¹ã·ºÓ¦Óã¬Æä°²È«ÐÔÒ²ÈÕÒæ³ÉΪ¹Ø×¢µÄ½¹µã
ÆäÖУ¬¶Ñ£¨Heap£©¹ÜÀí×÷ΪÄÚ´æ¹ÜÀíµÄÖØÒª×é³É²¿·Ö£¬Êǰ²È«·ÖÎöÈËÔ±ºÍ¹¥»÷Õß¾ºÏàÑо¿µÄÈȵã
±¾ÎĽ«ÉîÈë̽ÌÖLinux¶Ñ·ÖÎöµÄ¹Ø¼ü¼¼Êõ¡¢³£¼û©¶´ÀàÐÍÒÔ¼°ÈçºÎͨ¹ý¶Ñ·ÖÎöÀ´Ç¿»¯ÏµÍ³°²È«
Ò»¡¢Linux¶Ñ¹ÜÀí»ù´¡ ÔÚLinuxϵͳÖУ¬¶ÑÊÇÒ»¿éÓÃÓÚ¶¯Ì¬·ÖÅäÄÚ´æµÄÇøÓò£¬ÓɳÌÐòÔ±ÔÚ³ÌÐòÔËÐÐʱ¸ù¾ÝÐèÒªÉêÇëºÍÊÍ·Å
ÓëÕ»£¨Stack£©µÄ×Ô¶¯·ÖÅäºÍÊͷŲ»Í¬£¬¶ÑÄÚ´æµÄ·ÖÅäºÍÊÍ·ÅÐèÒª³ÌÐòÔ±ÏÔʽµØÍ¨¹ýÈç`malloc`¡¢`calloc`¡¢`realloc`ºÍ`free`µÈº¯Êý½øÐÐ
ÕâÖÖÁé»îÐÔËäÈ»´øÀ´Á˱à³ÌÉϵıãÀû£¬µ«Ò²Ôö¼ÓÁËÄÚ´æ¹ÜÀíµÄ¸´ÔÓÐÔ£¬ÈÝÒ×Òý·¢¸÷ÖÖ°²È«Â©¶´
Linux¶ÑµÄ¹ÜÀíÒÀÀµÓÚglibc£¨GNU C Library£©ÖеÄÄÚ´æ·ÖÅäÆ÷£¬Èçptmalloc£¨Pre-threaded Malloc£©»òºóÀ´µÄtcmalloc£¨Thread-Caching Malloc£©
ÕâЩ·ÖÅäÆ÷ͨ¹ýһϵÁи´ÔÓµÄËã·¨ºÍÊý¾Ý½á¹¹£¨Èçbins¡¢fastbins¡¢top chunk¡¢unsorted binµÈ£©À´¸ßЧµØ¹ÜÀíÄÚ´æ¿é£¬ÒÔÂú×ã³ÌÐò¶ÔÄÚ´æµÄ²»Í¬ÐèÇó
¶þ¡¢¶Ñ©¶´ÀàÐͼ°ÆäΣº¦ 1.»º³åÇøÒç³ö£¨Buffer Overflow£©£ºµ±Ïò¶ÑÖеĻº³åÇøÐ´ÈëµÄÊý¾Ý³¬¹ýÆä·ÖÅäµÄ´óСʱ£¬¿ÉÄܵ¼ÖÂÊý¾Ý¸²¸ÇÏàÁÚµÄÄÚ´æÇøÓò£¬½ø¶øÆÆ»µ³ÌÐòµÄÖ´ÐÐÁ÷³Ì»òй¶Ãô¸ÐÐÅÏ¢
2.ʹÓÃÒÑÊͷŵÄÄڴ棨Use After Free, UAF£©£ºµ±³ÌÐò³¢ÊÔ·ÃÎÊÒѾͨ¹ýfreeº¯ÊýÊͷŵÄÄÚ´æÇøÓòʱ£¬Èç¹û¸ÃÄÚ´æÇøÓòËæºó±»ÖØÐ·ÖÅäÓÃÓÚÆäËûÄ¿µÄ£¬¿ÉÄܵ¼ÖÂ䶨ÒåÐÐΪ»ò°²È«Â©¶´
3.Ë«ÖØÊÍ·Å£¨Double Free£©£º¶Ôͬһ¿éÄÚ´æÖ´ÐÐÁ½´Î`free`²Ù×÷£¬»áÆÆ»µ¶Ñ¹ÜÀíÆ÷µÄÄÚ²¿Êý¾Ý½á¹¹£¬¿ÉÄܵ¼ÖÂÈÎÒâÄÚ´æ¶Áд»ò¾Ü¾ø·þÎñ¹¥»÷
4.¶ÑÒç³ö£¨Heap Overflow£©£ºÀàËÆÓÚ»º³åÇøÒç³ö£¬µ«·¢ÉúÔÚ¶ÑÄÚ´æÇøÓò£¬Í¨³£ÓÉÓÚ²»×¼È·µÄÄÚ´æ´óС¼ÆËã»ò±ß½ç¼ì²é²»×ãÒýÆð
5.¸ñʽ»¯×Ö·û´®Â©¶´£¨Format String Vulnerability£©£ºµ±¸ñʽ»¯º¯Êý£¨Èçprintf£©µÄ²ÎÊý´íÎóµØÖ¸ÏòÓû§¿ØÖƵĶÑÄÚ´æÊ±£¬¹¥»÷Õß¿ÉÒÔÀûÓøñʽ»¯×Ö·û´®Ö¸Áî¶ÁÈ¡ÄÚ´æ»òÖ´ÐÐÈÎÒâ´úÂë
ÕâЩ©¶´²»½ö¿ÉÄܵ¼Ö³ÌÐò±ÀÀ£ºÍÊý¾ÝË𻵣¬»¹¿ÉÄܱ»¶ñÒâÀûÓã¬ÊµÏÖÔ¶³Ì´úÂëÖ´ÐУ¨RCE£©¡¢È¨ÏÞÌáÉý£¨Privilege Escalation£©µÈÑÏÖØºó¹û£¬ÑÏÖØÍþвϵͳµÄ°²È«ÐÔºÍÎȶ¨ÐÔ
Èý¡¢Linux¶Ñ·ÖÎö¼¼Êõ 1.¾²Ì¬·ÖÎö£ºÍ¨¹ý·ÖÎö³ÌÐòµÄÔ´´úÂë»ò¶þ½øÖÆÎļþ£¬Ê¹Óù¤¾ßÈç`Splint`¡¢`Cppcheck`µÈ¾²Ì¬´úÂë·ÖÎö¹¤¾ß£¬¼ì²âDZÔÚµÄÄÚ´æ¹ÜÀí´íÎóºÍ©¶´
¾¡¹Ü¾²Ì¬·ÖÎöÄܹ»·¢ÏÖһЩÃ÷ÏԵĴíÎ󣬵«ÓÉÓÚÆäÎÞ·¨ÍêȫģÄâ³ÌÐòµÄÔËÐÐʱÐÐΪ£¬¶ÔÓÚijЩ¶¯Ì¬·ÖÅäµÄ¶ÑÄÚ´æÎÊÌâ¿ÉÄÜÁ¦²»´ÓÐÄ
2.¶¯Ì¬·ÖÎö£ºÀûÓõ÷ÊÔÆ÷£¨ÈçGDB£©¡¢¶¯Ì¬·ÖÎö¹¤¾ß£¨ÈçValgrind¡¢AddressSanitizer£©ºÍÄÚ´æ¼à¿Ø¹¤¾ß£¨Èçstrace¡¢ltrace£©ÔÚ³ÌÐòÔËÐÐʱ¸ú×ÙÄÚ´æ·ÖÅäºÍÊÍ·ÅÐÐΪ£¬²¶×½Òì³£ºÍ´íÎó
¶¯Ì¬·ÖÎöÄܹ»¸ü׼ȷµØ·´Ó³³ÌÐòµÄÔËÐÐʱ״̬£¬ÊÇ·¢ÏÖ¶Ñ©¶´µÄÖØÒªÊÖ¶Î
3.·ûºÅÖ´ÐÐÓëÄ£ºý²âÊÔ£º·ûºÅÖ´ÐÐͨ¹ý·ÖÎö³ÌÐòµÄÖ´Ðз¾¶£¬³¢ÊÔ̽Ë÷ËùÓпÉÄܵÄÊäÈë×éºÏ£¬ÒÔ·¢ÏÖDZÔڵĩ¶´
Ä£ºý²âÊÔÔòͨ¹ý×Ô¶¯Éú³É´óÁ¿Ëæ»úÊý¾Ý×÷ΪÊäÈ룬¹Û²ì³ÌÐòÊÇ·ñ±ÀÀ£»ò±íÏÖ³öÒì³£ÐÐΪ
ÕâÁ½ÖÖ·½·¨½áºÏʹÓ㬿ÉÒÔÏÔÖøÌá¸ß·¢ÏÖ¶Ñ©¶´µÄЧÂÊ
4.¶ÑÄÚ´æ²¼¾Ö·ÖÎö£ºÉîÈëÀí½âLinux¶Ñ¹ÜÀíÆ÷µÄÄÚ²¿¹¤×÷»úÖÆ£¬·ÖÎö¶ÑÄÚ´æµÄ²¼¾ÖºÍ·ÖÅä²ßÂÔ£¬ÓÐÖúÓÚʶ±ðºÍÀûÓöÑ©¶´
ÀýÈ磬ͨ¹ý·ÖÎöfastbins¡¢binsµÈÊý¾Ý½á¹¹µÄ״̬£¬¿ÉÒÔÔ¤²âÄÚ´æÊͷźóµÄÖØÐ·ÖÅäÐÐΪ£¬½ø¶ø¹¹Ôì¹¥»÷ÔØºÉ
ËÄ¡¢»ùÓÚ¶Ñ·ÖÎöµÄϵͳ°²È«Ç¿»¯²ßÂÔ 1.´úÂëÉó²éÓ밲ȫ±àÂë¹æ·¶£º¼ÓÇ¿´úÂëÉó²é£¬È·±£×ñÑÁ¼ºÃµÄÄÚ´æ¹ÜÀíʵ¼ù£¬ÈçÕýÈ·¼ÆËãÄÚ´æ´óС¡¢Ê¹Óð²È«µÄ×Ö·û´®²Ù×÷º¯Êý¡¢±ÜÃâʹÓÃδ³õʼ»¯µÄÖ¸ÕëµÈ
2.¶¯Ì¬Ó뾲̬·ÖÎö½áºÏ£º½«¾²Ì¬·ÖÎöºÍ¶¯Ì¬·ÖÎöÄÉÈ뿪·¢Á÷³Ì£¬¶¨ÆÚ½øÐдúÂëÉ󼯣¬¼°Ê±·¢ÏÖ²¢ÐÞ¸´Ç±ÔڵĶÑ©¶´
3.Äڴ氲ȫ¹¤¾ß¼¯³É£ºÔÚ¹¹½¨ºÍ²âÊԽ׶μ¯³ÉÄڴ氲ȫ¹¤¾ß£¬ÈçAddressSanitizer¡¢Valgrind£¬È·±£ÔÚ·¢²¼Ç°·¢ÏÖ²¢ÐÞ¸´ËùÓÐÄÚ´æÏà¹ØÎÊÌâ
4.ȨÏÞ¸ôÀëÓë×îСȨÏÞÔÔò£ºÍ¨¹ý²Ù×÷ϵͳ²ãÃæµÄȨÏÞ¸ôÀë»úÖÆ£¬ÏÞÖÆ³ÌÐò¶Ô¹Ø¼ü×ÊÔ´µÄ·ÃÎÊȨÏÞ£¬¼´Ê¹³ÌÐò´æÔÚ©¶´£¬Ò²ÄܼõÉÙÆä±»ÀûÓõķçÏÕ
5.³ÖÐø°²È«¼à²âÓëÏìÓ¦£º½¨Á¢ÓÐЧµÄ°²È«¼à²â»úÖÆ£¬¼°Ê±·¢ÏÖ²¢ÏìÓ¦°²È«Ê¼þ
ͬʱ£¬±£³Ö¶Ô×îа²È«Â©¶´ÐÅÏ¢µÄ¹Ø×¢£¬¼°Ê±¸üÐÂϵͳºÍÈí¼þ²¹¶¡
½áÓï Linux¶Ñ·ÖÎöÊÇÒ»ÏÔÓ¶øÖØÒªµÄÈÎÎñ£¬Ëü²»½öÒªÇó·ÖÎöÕ߾߱¸ÉîºñµÄ²Ù×÷ϵͳºÍ±à³Ì֪ʶ£¬»¹ÐèÒªÊìϤ¸÷ÖÖÄÚ´æ¹ÜÀí¼¼ÊõºÍ°²È«·ÖÎö¹¤¾ß
ͨ¹ýÉîÈë·ÖÎöLinux¶ÑµÄ¹¤×÷ÔÀíºÍ³£¼û©¶´ÀàÐÍ£¬½áºÏÓÐЧµÄ°²È«²ßÂԺͼ¼ÊõÊֶΣ¬¿ÉÒÔÏÔÖøÌáÉýLinuxϵͳµÄ°²È«ÐÔ£¬±£»¤Êý¾ÝºÍ·þÎñµÄÍêÕûÐÔ
Ëæ×ż¼ÊõµÄ²»¶Ï½ø²½ºÍ¹¥»÷ÊֶεIJ»¶ÏÑݱ䣬³ÖÐøµÄѧϰºÍʵ¼ù½«ÊDZ£³Öϵͳ°²È«µÄ¹Ø¼ü