PHP bin2hex 容易受到定时攻击?

信息安全 php csrf 定时攻击
2021-08-17 09:27:39

我在几个地方[1][2][3] 读到了希望使 PHP 的 bin2hex 恒定时间的愿望。

在什么情况下 bin2hex 容易受到定时攻击?

下面的代码是否用于处理易受时间攻击的 CSRF 令牌?

// generate a CSRF token, n is some large number
$token = bin2hex(openssl_random_pseudo_bytes(n));
// ... store $token on in the PHP session and render form with CSRF token
// ... on form submission compare the form's CSRF token to the session token
hash_equals($sessionToken, $formToken);
  1. http://blog.ircmaxell.com/2014/11/its-all-about-time.html
  2. https://github.com/php/php-src/pull/909
  3. http://grokbase.com/t/php/php-internals/14bs5tmqbr/php-src-constant-time-bin2hex-implementation-909
1个回答

在什么情况下 bin2hex 容易受到定时攻击?

邮件列表和博客文章中讨论的定时攻击是缓存定时攻击,Daniel J. Bernstein 在此处针对 OpenSSL 的 AES 实现进行了著名的演示(PDF)。

为了bin2hex()容易受到定时攻击,必须满足以下条件:

  1. 在内部,它根据我们试图保护的秘密(例如 HMAC 密钥)建立索引或分支。PHP 实现根据可能是秘密的内容进行索引
  2. 攻击者必须能够以某种方式改变处理器缓存的状态。(例如,在与您的云提供商相同的裸机机器上租用邻居 VM,并执行类似于FLUSH+RELOAD的策略。)
  3. 攻击者可以从特权网络位置以最小的网络抖动快速发出许多有效请求(这些天令人惊讶地微不足道)。
  4. 我们要保护的密钥被重用。(一般情况;一些 CSRF 令牌没有被重用。)

这种攻击的可行性仍然是一个未知数,但修补这个潜在的侧通道实际上并不难。之前链接的方法源自libsodium 的 bin2hex 实现,由CodesInChaos提供。

下面的代码是否用于处理易受时间攻击的 CSRF 令牌?

我不知道。bin2hex()可能是一个非常次要的问题,但不是我可以展示实际利用的问题。也许加密堆栈交换中的某个人可以?

更新:有一个库

如果你使用paragonie/constant_time_encoding(当你问这个问题时它不存在),你不应该通过缓存计时泄漏任何信息。

<?php
use \ParagonIE\ConstantTime\Hex;

$rawBinary = random_bytes(32);
$data = Hex::encode($rawBinary);
$decoded = Hex::decode($data);

该库涵盖了所有 RFC 4648 编码方案:

  • 十六进制
  • Base32
  • Base32Hex
  • Base64
  • Base64UrlSafe
  • Base64DotSlash
  • Base64DotSlashOrdered

后两者兼容crypt(3)