将二进制数据传递给非二进制安全函数都有哪些安全隐患?
Posted
技术标签:
【中文标题】将二进制数据传递给非二进制安全函数都有哪些安全隐患?【英文标题】:What are the security implications of passing binary data to a non-binary-safe function?将二进制数据传递给非二进制安全函数有哪些安全隐患? 【发布时间】:2018-08-28 13:49:48 【问题描述】:在 php 中,“二进制安全”这个词在我看来像是一种安全功能,可以帮助防御二进制漏洞,例如缓冲区溢出等。
我还知道某些函数具有“多字节感知”替代方案,这些替代方案以 mb_
为前缀。例如,substr
和 mb_substr
。这些函数能够处理消耗超过一个字节的字符。
但是,将二进制数据传递给非二进制安全的函数意味着什么?这是固有的安全风险,还是该函数只会返回警告/错误?
我不是在谈论函数的输出可能会被传递到 SQL、html 等中,我是在谈论 PHP 本身对函数的实际处理。
非二进制安全函数是否仅设计用于安全处理文本,并且在将二进制数据传递给它们时存在缓冲区溢出或其他形式的二进制利用的风险?
【问题讨论】:
安全意味着它不会失败..与安全无关。欺骗:***.com/questions/3264514/… 如果给定二进制输入,非二进制安全函数的输出和/或行为是未定义的。正如劳伦斯所说,安全!= 安全。 不,二进制安全并不意味着“随机孩子输入一些随机序列的奇怪字符是安全的,这让他们可以访问你的机器”。不是这样的。 In PHP what does it mean by a function being binary-safe?的可能重复 感谢您的澄清。 @NB我能做些什么来防止这种情况发生?这只是在将用户输入从 PHP 传递出来之前验证用户输入,还是在 PHP 中处理它时我需要做一些事情?例如使用mb_
函数?
【参考方案1】:
将二进制数据传递给非二进制安全函数有哪些安全隐患?
这真的取决于你在做什么。
当 Facebook 试图从他们的 PHP-Graph-SDK 存储库中删除 mbstring 要求时,他们不小心引入了risk of message forgery:
function sammy_hash_equals($knownString, $userString)
$kLen = strlen($knownString);
$uLen = strlen($userString);
if ($kLen !== $uLen)
return false;
$result = 0;
for ($i = 0; $i < $kLen; $i++)
$result |= (ord($knownString[$i]) ^ ord($userString[$i]));
// They are only identical strings if $result is exactly 0...
return 0 === $result;
// 8 chars but 32 bytes
$hashA = "\xF0\x9D\x92\xB3" . "\xF0\x9D\xA5\xB3" .
"\xF0\x9D\x92\xB3" . "\xF0\x9D\xA5\xB3" .
"\xF0\x9D\x92\xB3" . "\xF0\x9D\xA5\xB3" .
"\xF0\x9D\x92\xB3" . "\xF0\x9D\xA5\xB3";
$hashB = "\xF0\x9D\x92\xB3" . "\xF0\x9D\xA5\xB3" .
"\xF0\xAD\x9F\xC0" . "\xF0\xAD\x9F\xC0" .
"\xF0\xAD\x9F\xC0" . "\xF0\xAD\x9F\xC0" .
"\xF0\xAD\x9F\xC0" . "\xF0\xAD\x9F\xC0";
var_dump(sammy_hash_equals($hashA, $hashB));
在这种情况下,配置设置 mbstring.func_overload
将决定这是否可以被利用。只有当有人尝试在具有此配置的 PHP 5.5(或更早版本)项目中使用 hash_equals()
并使用 Sammy 的补丁的早期版本时,它才会被利用。
您将遇到的最多情况是您的数据被损坏(也称为损坏),您必须处理恢复和/或清理数据的具有挑战性的任务。不好玩。
非二进制安全函数是否仅设计用于安全处理文本,并且在将二进制数据传递给它们时存在缓冲区溢出或其他形式的二进制利用的风险?
不,这里没有缓冲区溢出风险。
【讨论】:
以上是关于将二进制数据传递给非二进制安全函数都有哪些安全隐患?的主要内容,如果未能解决你的问题,请参考以下文章