问题标签 [timing-attack]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
153 浏览

c - 这个 prefetch256() 函数是否对 AES 上的缓存定时攻击提供任何保护?

这是一个边缘话题。由于我想了解编程、CPU 缓存、读取 CPU 缓存行等,所以我将其发布在这里。

我在 C/C++ 中实现 AES 算法。由于在没有硬件支持的情况下执行 GF(2 8 ) 乘法计算成本很高,因此我已优化为使用 AES S-box 的查找表。但不幸的是,基于查找表的实现容易受到缓存定时攻击。因此,由于对 CPU 缓存非常幼稚,我开始了解它是如何工作的,以及如何在不增加任何计算成本的情况下规避此类攻击。

我意识到在实践中存在 AES NI 指令和 Bit Slice AES 实现,但它们远远超出了我目前的理解。

我从 crypto.SE 了解到,最简单的方法是在查找之前读取所有缓存行或读取整个表。(这也影响了我的表现)但是我不知道如何在软件中实现它,也不知道它背后的复杂概念。

OpenSSL 的 C 实现参考指南中——aes-x86core.c 作者实现了一个函数:

  • for循环i中,8ifsizeof(t[0])为 4。由于 AES sbox 是一个unsigned char包含 256 个元素的数组,当我们调用 时prefetch256(sbox),sbox 指针被强制转换为一个unsigned long指针,因此使用取消引用的每个元素t[i]都是 4 个字节。但我不明白为什么我们跳过 32 个字节,而不是完全读取它(以防止缓存定时攻击)?
  • 背后的动机sum ^= t[i]和背景是ret = sum什么?

  • 是否有其他更简单的解决方案来保护我的实现免受缓存定时攻击?以下更简单的代码会对我有帮助吗:

    /li>
0 投票
1 回答
156 浏览

php - PHP登录的拆分令牌 - 定时攻击

我正在创建一个 PHP 登录系统。用户将收到一封电子邮件,其中包含指向将检查一次性链接的网站的一次性链接,并以 cookie/会话的形式提供令牌。我的问题是如何拆分令牌和/或一次性链接以防止定时攻击。

我的会话表:

令牌将使用以下代码生成并保存到数据库:

0 投票
0 回答
27 浏览

php - 无法在 PHP 中检测到任何有意义的时间差异(恒定时间攻击)

有很多关于 PHP 的文章指出,在进行直接字符串比较时可能会发生持续定时攻击。我编写了一些示例代码来尝试确定数量级差异,但它表明即使进行数百万次测试,也并非总是一个比另一个快。

您会期望第一次迭代活动时间更快,因为字符串中的第一个字符是错误的,因此比较可以退出,但情况并非总是如此。

0 投票
1 回答
80 浏览

javascript - 检查对象键的存在是否被认为是时间安全的?

因此,我正在为一个主要是私有服务器的用户提供一个非常短的列表,并将这些用户的登录数据存储在一个对象中。该对象的结构类似于 {"username":"hash"}。我想知道使用类似的东西if(users[username) {timingSafeCompare(hash,users[username])}是否被认为是时间安全的。

我想过使用类似的东西

但同样,我不确定这是否时间安全。

最好的方法是什么?

0 投票
0 回答
38 浏览

javascript - 改进这种定时攻击的方法(代码挑战)

在过去的几个月里,我一直在努力、离开和回到这个代码挑战,每次回来我都是从头开始,因为我真的不知道当时我的想法在哪里,是否是正确的轨道。

挑战的基本前提是要破解一个 32 位的密码,你要编写一个函数,该函数将提供一个“登录”函数作为参数,它会根据密码是否正确返回 true 或 false正确的。

使用 32 位数字任意暴力破解密码显然不是一种选择。但是,对登录功能的少量调查表明它容易受到定时攻击,它使用迭代字符串比较,当它遇到不正确的字符时会短路。

所以到目前为止我的方法是初始化一组数字代码,并运行一个循环,在这个循环中,我平均尝试使用该代码登录数千次(当前为 10,000,但该数字是任意选择的),然后对代码的平均值,并从该迭代中表现最好的代码生成新代码。

我有一个相当大的问题,即我永远不会丢弃任何代码,以防性能最佳的代码不在正确的路径上,并且只是因为执行时间中的一些噪音而成为最好的。平均值中的噪声本身就是一个问题,我认为通过平均几千个,我可以解释任何给定函数执行时的噪声,但是当查看各种迭代的结果时,我可以看到不正确的代码有时仍然会异常长。

显然,我的解决方案太慢了,无法通过挑战,我正在寻找有关如何提高其准确性和效率的建议。到目前为止,这是我的代码:

这可能更适合代码审查,但由于它还不是一个完整的解决方案,我不确定。

0 投票
2 回答
114 浏览

python-3.x - 我应该使用 == 进行字符串比较吗?

对不起,如果这是一个奇怪的问题。

我其实对定时攻击很好奇,所以我做了一些研究并理解了这个概念。我明白了,代码如下:

相当于:

PS - 我正在使用 python 3.9.2

所以我制作了一个易受攻击的代码,如下所示:-

这个简单的程序会将用户给定的密码(通过upass参数)与存储在同一目录中的文件pass.txt中的密码进行比较。如果密码匹配,那么它会用欢迎消息问候用户,否则,它会提醒用户登录失败。

假设:-

  1. 密码长度为 4 个字符。
  2. 它只是大写字母(没有数值或特殊字符)。

我可以使用以下方法利用密码:-

我得到了TEST正确的输出。但是,您可以清楚地看到我没有使用==字符串比较,实际上我使用的是它的等效方法。所以我决定切换回==并检查我的漏洞利用是否有效。所以我将equal()方法修改为:-

所以使用这段代码,当我调用该attack方法时,令我惊讶的是它给了我非常奇怪的结果。当我多次运行它时,我得到了以下输出:AOAD, BVCB& LGAZ。这显然不是pass.txt文件中存储的密码。

所以我的问题是,是==不是容易受到定时攻击?

0 投票
1 回答
80 浏览

javascript - 修复定时攻击

我使用此代码登录用户。密码是用加密的bcryptSALT_ROUNDS每个用户的密码都是一样的

(comparePassword 是一个猫鼬函数)

如您所见,由于短路,if-check 可能需要不同的时间来执行 - 这对于客户端是可衡量的。

这意味着,客户可以查明某封电子邮件是否使用了我们的服务——这是一次轻微的数据泄露。

我需要这样的脚本:

但不知道如何实现它。

一个想法是创建一个虚拟用户来创建comparePasswordon if !user,但我不确定它的优点/缺点,或者是否有更好的解决方案。

编辑:我如何将所有这些包装在一个setTimeout函数中?无论如何,这将需要 1 秒(或 500 毫秒或其他时间)。

0 投票
2 回答
67 浏览

django - 防止django send_mail timimg 攻击

我有不同的 REST-API 视图,我可以在其中发送邮件(如果存在帐户)或不发送邮件。例如,用户可以以忘记密码的形式输入电子邮件,如果帐户存在则发送邮件。

from django.core.mail import send_mail用来发送邮件。

问题是,这需要一些时间,因此对有效电子邮件的请求通常比对非退出电子邮件的请求长。这允许攻击者比较请求时间以找出帐户是否存在。

有什么方法可以打电话send_mail()而不发邮件吗?或者,对于这两种情况,使请求时间同样长的解决方法是什么?

注意:如果我不发送邮件,我可以检查 send_mail() 平均需要多长时间并等待这个时间。由于该应用程序在具有不同配置的不同服务器上运行,因此在我的情况下通常无法做到这一点。我宁愿不将每台服务器的平均执行时间存储在数据库中来解决这个问题。

0 投票
1 回答
144 浏览

node.js - nodejs:对“==”的定时攻击

最近我通过了关于hackerone 的CTF 的这篇文章在这篇文章中,完成挑战的部分是执行定时攻击。它激起了我的兴趣,我想创建一个容易受到时间攻击的网站。

为此,我决定使用 nodejs,因为这是我最熟悉的。但是,我无法复制它,所以我必须创建自己的strcmp函数并在该函数中引入时间差。现在代码看起来像这样

为了测试我使用 pythonsrequests库的时间。我的代码与文章中使用的代码非常相似,看起来像这样

我的问题是:为什么在我的情况下仅使用 来执行定时攻击不起作用==?如果它应该起作用并且我想实施它,我需要在网站上做些什么不同的事情?

0 投票
1 回答
79 浏览

c - 如何理解我的 C 代码是否为常数时间?

我有一个多项式乘法的代码,它是用 C 语言编写的。我听说特定指令是否是“恒定时间”可能因架构和处理器型号而异,并且没有任何官方文档说明这种行为。我如何理解我的代码是否是常数时间?

注意:“恒定时间”是指能够抵抗定时攻击的软件或代码片段。我在英特尔 i7 第 10 代 PC 上使用 UBUNTU。