提问人:jason 提问时间:1/5/2021 更新时间:1/5/2021 访问量:48
当字符串可变时,攻击是如何发生的?
How does attack take place when string is mutable?
问:
经常听到字符串是不可变的,这提高了安全性。我理解这样的想法,即由于字符串是最终的,因此以后无法更改其内容。但即使内容可以更改,我认为它仍然是安全的,因为代码是由开发人员而不是攻击者编写的。
否则在实践中,这种攻击实际上是如何进行的?
我在网上看到一个例子,表明如果字符串是可变的,攻击者可以绕过安全性。我不明白。以下代码由开发人员编写。这是攻击者永远无法触及的部分。无论字符串是否可变,攻击者永远无法修改其值,对吧?
public class FileInputStream
{
private String filename;
public FileInputStream(String filename)
{
if (!allowedToReadFile(filename))
throw new SecurityException();
this.filename = filename;
}
...
}
答:
1赞
Ohad Zadok
1/5/2021
#1
我相信你指的是内存溢出,如果一个字符串是可变的,那么它有一个固定的内存大小,不能改变,如果不是,可以输入一个足够长的值,可以溢出到其他内存区域,并覆盖其他变量的内容,从而引入安全风险。
例如,假设您的程序中有两个变量,var1 和 var2,它们都是 3 字节大小的预定义字符串,而不是您的内存分配如下所示:
[var1, var1, var1, var2, var2, var2]
初始化时的实际值为:
[0,0,0,0,0,0]
然后你向用户查询输入,你得到“aaaa”,你的内存堆栈看起来像
[a,a,a,a,0,0]
这意味着第一个变量与第二个变量之间存在溢出。
这非常依赖于语言。
评论
0赞
jason
1/5/2021
这听起来有点抽象,您能否举例说明如何通过此实现对打开另一个意外文件的攻击?
0赞
jason
1/5/2021
谢谢你的例子。它非常详细。因此,假设攻击者知道内存是如何分配的,并且有查询输入供攻击者这样做。我明白你的意思了吗?回到这个例子,如果是这样的话,恐怕这种攻击打开另一个文件的可能性非常低,因为攻击者怎么可能知道即使真的存在一个输入供他覆盖,进行有意义的攻击也很宝贵?
0赞
Ohad Zadok
1/6/2021
这取决于你使用的语言,如果是 c,则它正在被编译为汇编,攻击者可以进行逆向工程并查看内存布局。如果您觉得这个答案可以接受,请将其标记为接受,谢谢!
0赞
jason
1/6/2021
对不起,我仍然不明白这如何对上述示例进行有意义的攻击,除非仅将攻击视为只是简单地尝试输入足够大的输入来扰乱系统。
评论