查看文章 |
很高兴阿里的文学青年之一的大风又开始写blog了,写blog分享技术的都是好青年。文学青年就是有激情,饭都可以不吃忙着写blog一下就是n篇,其中《关于PHP的is_a()函数执行代码的问题》《谁来为漏洞买单?》都是与php的is_a()有关的。“对于is_a()调用__autoload()导致的安全问题”是不是php的is_a()的漏洞?在大风文章里可以看得出来,他是认为是php的漏洞,只是说得比较“和谐”[不知道我有没有理解错 :)]。 但是在微薄及hi群里讨论及博客留言来看,还有很大一部分人是为php官方喊冤的!其实我认为php官方并没有被冤枉,他们是有“漏洞"的! 在我前不久发布的ppt《WEB代码审计与渗透测试》里有一句话:"什么样的函数导致什么样的漏洞!"这个针对与应用层来说,“漏洞”与”函数的功能”是不分的。 从功能角度来说,先看看php手册关于is_a()的描叙: is_a (PHP 4 >= 4.2.0, PHP 5) is_a — 如果对象属于该类或该类是此对象的父类则返回 TRUE 而在早期的php的版本里并且没有提到会调用__autoload(),但是到了PHP 5.3.7里的is_a()突然可以自动调用__autoload(),但是手册里并没有说明!!! 这个和药物的不良反应有点类似,就是说给你带来治疗效果的同时也带来的一个不良副作用,并且这个不良反应并没有在说明说上标明! 可能有人说自动调用__autoload()不是“副作用”,是有计划有意识的功能升级!对于这个我可以举一个很好的列子:那就是“伟哥”的诞生[具体科普自行搜索:)] 另外很多人把exec(),system()等函数抬出来了,从上面的角度去看的话,你就可以看到区别了! exec(),system()这些的功能本来就是他们存在的理由,程序员们都知道!但是is_a()的这个问题,在漏洞公告发布前,估计也没啥子人知道! 所以php官方是有责任的,是有漏洞的!如果是正常功能升级,你应该及时准确的说明[特别是在程序员宝典:php手册里标明!],如果这个不是函数设计的“功能”,那就可以说这个就是is_a()的漏洞了。不管怎么样,两者结果都是php官方的“漏洞”。 在hi群讨论这个问题的时候,提到了一个php本身无法改变的问题,那就是php的“SB化”带来的安全风险.php的函数丰富、复杂、开发门槛低是php的特点也是他生存发展之道,这个就是说"SB化",php的发展其中一个重要的部分就是把以前app实现的一些功能,php自己本身去实现一个函数,然后app开发可以直接调用。 但是在这个"SB化"的过程里,在他对本身函数“封装”的过程里,缺少了对应的安全防御体系!这个也就是为什么php会出现那么多独特的漏洞,或者容易导致安全风险的“特性”! 最后还说说防御的问题,对于web应用程序的开发的安全问题我一直提创“《web app安全的独立性》”,所以我们开发的时候不要依靠php官方来解决这个问题!对于"is_a()函数执行代码",根据《那“一刹那”的防御》里提到的,最终导致导致代码执行的是__autoload()函数里的包含函数导致的问题,所以说is_a()甚至包括__autoload()都只属于变量提交的过程的一部分,所以防御还是在最终导致代码执行的包含函数里面! 对于《谁来为漏洞买单?》里提到了“如果PHP在源头修补了这个问题,才真正是善莫大焉。”这样的美好愿望!我有也这么认为,这个符合“最短距离,解决问题 ,才是王道。”[另外对于上面提到的《那“一刹那”的防御》的思路也是属于这个“最短距离”的 :)]。不过一切都是美好的愿望,如果这个世界真的有一个唯一的“上帝”,那么这个唯一的“上帝”一句话,就可以让从源头搞定了。记得某牛人说过MSSQL注射应该是MS的漏洞,可惜MS不这么认为,而且这个唯一的上帝也没有出来说句话~~~~ http://seclists.org/fulldisclosure/2011/Nov/43 _______________________________________________________________________ Mandriva Linux Security Advisory MDVSA-2011:166 http://www.mandriva.com/security/ _______________________________________________________________________ Package : php Date : November 3, 2011 Affected: 2010.1, 2011. _______________________________________________________________________ Problem Description: A vulnerability has been identified and fixed in php: The is_a function in PHP 5.3.7 and 5.3.8 triggers a call to the __autoload function, which makes it easier for remote attackers to execute arbitrary code by providing a crafted URL and leveraging potentially unsafe behavior in certain PEAR packages and custom autoloaders (CVE-2011-3379). The php-ini-5.3.8 package was missing with the MDVSA-2011:165 advisory and is now being provided, the php-timezonedb package was upgraded to the latest version (2011.14) for 2011. The updated packages have been patched to correct this issue. ___________________________________________________________________ |

