小编Ben*_*rns的帖子

是否有可能在Java中存储堆栈的秘密?

在Java中,存储密码的旧方法(如密码)可以使用,char[]因为您可以在完成后覆盖其数据.然而,由于垃圾收集器在重新组织堆时会复制内容,因此这被证明是不安全的.在某些体系结构中,可能会释放页面,并且当其他程序分配同一页面时,秘密将保留.

这非常难看,但是如果秘密存储在Thread run方法的堆栈上呢?仍需要注意优雅地终止线程,以便它可以将其数据清零,但这个问题也以旧的方式出现.

我直接看到的一个主要问题是我无法想到一种安全的方法来获取数据进出容器.您可以通过使用具有非常小的内部缓冲区的流来最小化泄露秘密的可能性,但最终您最终会遇到与此相同的问题char[].[编辑:单个private static byte成员和国旗会有效吗?虽然这会限制每个ClassLoader一个秘密.这增加了更多的丑陋,但它可能很容易隐藏在一个写得很好的界面后面.]

所以我真的有很多问题.

堆栈比这些类型的攻击更安全吗?是否有任何纯Java机制以对这个问题有用的方式在两个不同的堆栈帧之间执行堆栈到堆栈的复制?如果没有,JVM是否甚至支持字节码中的这种类型的操作?

[编辑:在人们过分担心之前,这更像是一个思想实验而不是其他任何东西.我绝对没有打算"在生产中测试"或在任何当前项目中使用它.我意识到我所说的内容真的很难看,可能非常笨重,并且可以对抗整个JVM结构.我只是对它是否有可能感兴趣,它是否真正实现了我的目标,以及它需要什么样的英雄才能实现目标.

java memory security jvm java-bytecode-asm

21
推荐指数
1
解决办法
436
查看次数

POSIX兼容的方式告诉系统是否重启?

我正在编写一些高度可移植的安全代码.我试图避免实用程序中的安全漏洞,例如在某些版本中找到的这个sudo:

...通过运行sudo -k然后将系统时钟重置为01-01-1970,可以成为超级用户.

发生这种情况是因为sudo依赖于绝对(即日历)时间来确定访问是否已超时.

我的想法是使用CLOCK_MONOTONIC定义的time.h.

POSIX标准来看,

[CLOCK_MONOTONIC]被定义为一个时钟,其值不能通过clock_settime()设置,并且不能有后向时钟跳转.最大可能的时钟跳转应由实现定义.

问题是,在许多(大多数?)系统上,CLOCK_MONOTONIC重启时会重置.是否有任何保证 POSIX兼容的方法来确定自程序上次运行以来系统是否已重新启动?

一种(坏)方法是检查存储的时钟值是否大于当前时钟值,但这只会改变问题.在CLOCK_MONOTONIC重新启动时重置的系统上,可能会有一个TIMEOUT允许访问的短窗口.

我错过了什么可以避免这个问题?

security time posix exploit clock

12
推荐指数
1
解决办法
635
查看次数

如何确定哪个规则导致文件在Mercurial中被忽略?

Mercurial目前忽略了一个我认为不应该被忽视的文件.该.hgignore文件非常大,经过粗略的阅读后,不清楚哪个规则是罪魁祸首.

有没有办法让Mercurial告诉我.hgignore中的哪些规则(如果有的话)匹配文件?

mercurial hgignore

9
推荐指数
1
解决办法
533
查看次数

如何强制JSON-lib的JSONObject.put(..)转义包含JSON的字符串?

使用JSON-lib时JSONObject,如何阻止该put方法存储包含JSON作为JSON而不是转义字符串的String?

例如:

JSONObject obj = new JSONObject();
obj.put("jsonStringValue","{\"hello\":\"world\"}");
obj.put("naturalStringValue", "\"hello world\"");
System.out.println(obj.toString());
System.out.println(obj.getString("jsonStringValue"));
System.out.println(obj.getString("naturalStringValue"));
Run Code Online (Sandbox Code Playgroud)

打印:

{"jsonStringValue":{"hello":"world"},"naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
Run Code Online (Sandbox Code Playgroud)

我希望它打印:

{"jsonStringValue":"{\"hello\":\"world\"}","naturalStringValue":"\"hello world\""}
{"hello":"world"}
"hello world"
Run Code Online (Sandbox Code Playgroud)

是的,我意识到这是令人讨厌的.但是,这支持JSON序列化管道,为了互操作性,这是预期的行为.在某些情况下,我们会序列化可能包含有效JSON的用户输入.我们不希望用户输入成为我们将所述输入序列化的JSON对象的一部分.

手动转义不起作用,因为它导致JSON-lib转义\字符:

JSONObject obj = new JSONObject();
obj.put("naturalJSONValue","{\"hello\":\"world\"}");
obj.put("escapedJSONValue", "{\\\"hello\\\":\\\"world\\\"}");
System.out.println(obj.toString());
System.out.println(obj.getString("naturalJSONValue"));
System.out.println(obj.getString("escapedJSONValue"));
Run Code Online (Sandbox Code Playgroud)

输出:

{"naturalJSONValue":{"hello":"world"},"escapedJSONValue":"{\\\"hello\\\":\\\"world\\\"}"}
{"hello":"world"}
{\"hello\":\"world\"}
Run Code Online (Sandbox Code Playgroud)

此时,任何启用手动选择性转义复杂JSON对象的变通方法都会完全否定首先使用JSON-lib的价值.

另外,我知道之前已经提出这个问题,但不幸的是我不能轻易接受它的答案.JSON-lib在我的项目的许多方面都是一个经常使用的依赖项,并且交换它将是一项艰巨的任务.我需要绝对肯定在我可以接受与Jackson,simple-json或Gson的交换之前,没有办法用JSON-lib实现这个目标.

java serialization json json-lib

7
推荐指数
2
解决办法
7943
查看次数

如何只允许隧道连接到端口?

我想让一个git-daemon通过一个永久的ssh隧道.我完成了这项任务.如何阻止任何与GIT_DAEMON端口的远程无连接连接(在我的情况下为9418)?

我已经在iptables中尝试了简单的规则(阻止除localhost之外的所有内容):

$ iptables -A INPUT -p tcp -d ! localhost --destination-port 9418 -j DROP
Run Code Online (Sandbox Code Playgroud)

但它也会阻塞隧道(因为它节省了源IP地址).如果我还有一个主机用于防火墙,可以通过阻止与该端口的任何远程连接来完成,但我需要这个主机来完成这项工作.

隧道以两种方式之一创建:

对于Windows:

plink.exe -N -i <key> -L 127.0.0.1:9418:192.168.1.69:9418 tunnel@192.168.1.69
Run Code Online (Sandbox Code Playgroud)

对于Linux:

ssh -N -i <key> -L 127.0.0.1:9418:192.168.1.69:9418 tunnel@192.168.1.69
Run Code Online (Sandbox Code Playgroud)

linux ssh port tunnel

5
推荐指数
2
解决办法
1450
查看次数

如何使用python的http.client准确读取一个响应块?

使用http.client在Python 3.3+(或任何其他内置的Python HTTP客户端库),我怎么可以一次读取分块的HTTP响应正好一个HTTP块?

我正在扩展服务器的现有测试装置(使用python编写http.client),该服务器使用HTTP的分块传输编码来编写其响应。为了简单起见,假设我希望能够在客户端收到HTTP块时打印一条消息。

我的代码遵循相当标准的模式来读取较大的响应:

conn = http.client.HTTPConnection(...)
conn.request(...)
response = conn.getresponse()

resbody = []

while True:
    chunk = response.read(1024)
    if len(chunk):
        resbody.append(chunk)
    else:
        break

conn.close();
Run Code Online (Sandbox Code Playgroud)

但这将读取1024字节的块,无论服务器是否发送10字节的块或10MiB的块。

我正在寻找的东西将如下所示:

while True:
    chunk = response.readchunk()
    if len(chunk):
        resbody.append(chunk)
    else
        break
Run Code Online (Sandbox Code Playgroud)

如果无法使用http.client,则可以使用另一个内置的http客户端库吗?如果内置客户端库无法实现,可pip安装模块是否可以实现?

python http python-3.x http.client

3
推荐指数
2
解决办法
4578
查看次数

为什么我不能从具有泛型参数的类型转换为泛型接口,泛型参数是我的接口中泛型参数的子类型?

鉴于以下接口:

public interface IController<T> where T: Request {
    Response HandleRequest(T request);
}
Run Code Online (Sandbox Code Playgroud)

以及以下请求类:

public BlergRequest : Request {
}
Run Code Online (Sandbox Code Playgroud)

以及以下控制器实现:

public BlergController : IController<BlergRequest> {
    public Response HandleRequest(BlergRequest request) {
        return new Response("Here's your blergs!");
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么下面是InvalidCastException

IController<Request> controller = (IController<Request>)new BlergController();
Run Code Online (Sandbox Code Playgroud)

在调试器的“立即”窗口中,我有以下内容:

typeof(Request).IsAssignableFrom(typeof(BlergRequest))
true

typeof(IController<Request>).IsAssignableFrom(typeof(BlergController))
false
Run Code Online (Sandbox Code Playgroud)

是什么赋予了?我认为这是通用约束的全部意义?

c# generics

1
推荐指数
1
解决办法
282
查看次数