【发布时间】:2014-02-20 14:20:11
【问题描述】:
我正在学习安全性并正在研究以明文方式存储秘密。
当我检索私有字段的内容时,它返回一个对象。我的恶意代码正确地假定并将对象转换为 int,但是如果我将字段类型从 int secretInt = 42; 更改/解析为 String secretInt = (new Integer(42).intValue()).tostring,恶意代码将失败。
编辑:不寻常的包装 (new Integer(42).intValue()).tostring 是由自动解析器创建的,而不是由程序员编写的。
我怎样才能为 Mal 代码添加健壮性,以便删除返回类型的假设。这可能吗?我需要将此值用作 int 参数。
编辑:'String' 是一个例子,但解析器可能会选择一种数据结构,因为它不适合 byte[]、char[]。
这是我的不合规代码。
public final class SecretInClear implements Check4SecretsInClear {
//Non-Compliant: Secret int stored in Clear.
private final int secretInt = 42;
@Override
public boolean isSecretInt(int check) {
return (check == secretInt);
}
}
这是我的恶意代码。
public class ReadClearSecret implements Tester {
//Example of running
public static void main(String[] args) {
String testResult = new ReadClearSecret().test(new SecretInClear());
System.out.println(testResult);
}
private Object readPrivateField(Object o, String fieldName) {
try {
Field field = o.getClass().getDeclaredField(fieldName);
field.setAccessible(true);
return field.get(o);
} catch(Exception e) {
throw new IllegalArgumentExecption(e);
}
@Override
public String test(final Object secretChecks) {
final Check4SecretsInClear check4SecretsInClear = (Check4SecretsInClear)secretChecks;
StringBuilder stringBuilder = new StringBuilder();
stringBuilder.append("class:").
append(check4SecretsInClear.getClass().getSimpleName());
boolean bSecretInt = false;
String s = "";
try {
int secretInt = (Integer)readPrivateField(check4SecretsInClear,"secretInt"); //<<< HERE! It's cast as an integer!!!
bSecretInt = check4SecretsInClear.isSecretInt(secretInt); //<<< HERE! Param must be an int.
} catch (ClassCastException e) {
s = "," + e.getClass().getSimpleName();
} finally {
stringBuilder.append(" int:").append(bSecretInt).append(s);
s = "";
}
return stringBuilder.toString();
}
}
编辑:
而不是从readPrivateField() 转换 (int)。相反,我提取字符串值String.valueOf(Object) 或Object.toString()。然后我可以将该字符串作为 int 参数传递给 new Integer(stringValue)。
但是:
如果解析器选择将secretInt 表示为 byte[] 类型,则字符串值将是疯狂的,并且恶意代码将被 pwned。有什么建议可以对此产生鲁棒性吗?
【问题讨论】:
-
instanceof怎么样? -
我是从
Class<?> type = field.getType();那里得到的吗? -
关于
non-compliant代码:if(condition){return true}else{return false}与return condition相同。另外,如果您只想将secretInt与原始int进行比较,为什么还要将secretInt包装在新的Integer中?无论如何,包裹的secretInt将立即拆箱为原始int。 -
在向下转换之前,您可以使用
instanceof检查类型。 -
@Pshemo "与返回条件相同" 哈哦耶!不错!
标签: java security reflection refactoring exploit