+117
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
public class Foo {
public Foo() {
System.out.println("constructing foo: " + this);
throw new RuntimeException();
}
public void doEvil() {
System.out.println("Evil!Evil!Evil");
}
}
public class MyFoo extends Foo {
public static Foo x;
@Override
protected void finalize() throws Throwable {
x = this;
}
}
try {
Foo x = new MyFoo();
} catch(Exception e) {
System.out.println(""+e);
}
System.gc();
System.runFinalization();
System.out.println("MyFoo instance: " + MyFoo.x);
MyFoo.x.doEvil();
Вот так бесстрашные хакеры получают доступ к методу экземпляра объекта, конструктор которого выбрасывает исключение, а потом жалуются, что, мол, Java - решето.
А теперь вопрос на засыпку: как сделать то же самое, не используя finalize и gc?
Запостил: someone,
12 Июля 2012
someone 12.07.2012 09:35 # 0
rat4 12.07.2012 10:23 # 0
http://ideone.com/1aiJh
someone 12.07.2012 10:30 # 0
Под SecurityManager'ом не заработает. А как без setAccessible? И вообще без рефлексии?
EDIT: И без сановских хакерских функций. Чисто стандарт.
bormand 12.07.2012 10:38 # 0
rat4 12.07.2012 10:42 # 0
someone 12.07.2012 13:17 # 0
Но нет. Чисто языковые средства. Подсказка: уязвимость специфична конкретно для этого класса Foo, в общем случае не сработает.
roman-kashitsyn 12.07.2012 13:26 # +6
someone 12.07.2012 13:28 # 0
roman-kashitsyn 12.07.2012 10:30 # +4