PHP修复输入验证代码中的漏洞
编译:代码卫士
目前,PHP 8.0和7.4 仍然受支持且易受攻击。如用户使用的并非最新的8.1 版本,则需要分别升级至 8.0.16和7.4.28 版本。
基于使用PHP查询数据库的 PoC exploit ,该漏洞可用于使 PHP 进程崩溃,很可能导致DoS 攻击。当然,和往常一样,Mozilla 在安全更新中指出,修复具有内存损坏证据的漏洞后,应该“假设某些漏洞本可被用于执行任意代码”。
远程代码执行 (RCE) 即从外部提交的数据不仅可以导致计算机上的程序崩溃,还可能在该进程中获得控制权,通常会导致网络入侵、数据提取、恶意软件植入等等。
具有讽刺意味的是,PHP 过滤函数旨在验证导入的数据,如确保有人发送的整数(如5、7、11)并非无法被可靠地转为整数(如3.14159或3/16 inch)的文本字符串。
CVE-2021-21708 是负责检查有效浮点数的代码的一部分。PHP 的数字过滤函数使用户不仅可检查导入的数据是合法的,而且还检查它位于某个特定范围如确保其不大于2.71828或介于-1和1之间。如果导入数字已经是浮点数,则如下代码所示,PHP的旧版本代码(8.1.2)位于左侧,新版本代码 (8.1.3) 位于右侧(此处无bug,因此两个版本是相似的)。不了解C语言也没关系,需要注意的点是首先完成错误检查,之后是一行代码以释放PHP当前使用的内存以存储该数字,接着立即又是一行代码为PHP重新分配内存供使用。Zval_ptr_dtor() 是PHP 内部内存指针析构函数的简称。
如果导入的数字是一个整数,没有小数点后面的部分,则所用代码应该略有不同。
如下所示,旧版本中的顺序“执行检查,如失败则推出;但如成功,则为数字取消分配并重新分配存储空间”是混合的,其顺序是“取消该PHP值使用的内存分配,然后执行检查,如失败则退出,留下的指向内存的PHP对象不久将被分配到其它地方,之后将引发释放后使用问题;但如果检查成功,则为该数字重新分配新的存储空间。”这就像先走到路上,之后才检查路面是否安全再完成过路动作。新版本代码已将检查路面是否安全放在首位,之后再上路并直接走到对面。
由Visual Studio Code 的“diff”视图展现了8.1.2版本中标记的红色部分被转移到8.1.3版本的绿色部分。
如果你是PHP用户,则更新至8.1.3版本。如尚未更新至PHP 8.1版本,则更新至更早的两个分支版本:8.0版本需升级至8.0.16,7.4版本需升级至7.4.28版本。如使用Linux 发行版本管理PHP,则查看各发行版本获取详情。
如为程序员,则需要注意用C编写的代码要求一直注意随处的内存,因此隐藏良好的像本文提到的漏洞不会潜入。
如为程序员,则尝试编写代码时减少在你之后的编程人员带来的错误数量。
PHP Everywhere 插件中存在严重RCE,影响数千个 WordPress 站点
https://nakedsecurity.sophos.com/2022/02/18/irony-alert-php-fixes-security-flaw-in-input-validation-code/
题图:Pixabay License
本文由奇安信编译,不代表奇安信观点。转载请注明“转自奇安信代码卫士 https://codesafe.qianxin.com”。
奇安信代码卫士 (codesafe)
国内首个专注于软件开发安全的产品线。