tutorial - ¿Es posible almacenar secretos en la pila en java?
pilas estructura de datos java (1)
Yo usaría un ByteBuffer directo. La memoria que utiliza no está copiada y solo está en un lugar durante la vida útil del ByteBuffer. Por cierto, no use clear () ya que esto simplemente restablece la posición. Puedes sobrescribirlo con
bb.clear();
while(bb.remaining() >= 8) bb.putLong(0);
while(bb.remaining() > 0) bb.put((byte) 0);
¿Es la pila más segura de este tipo de ataques que el montón?
Yo no lo creo.
¿Hay mecanismos Java puros para realizar una copia de pila a pila entre dos marcos de pila diferentes de una manera que sería útil para este problema?
Podrías guardar el secreto como uno o dos s long
.
Si no es así, ¿la JVM admitiría este tipo de operación en el código de bytes?
El código de bytes está diseñado para admitir Java y hace muy poco más de lo que puede hacer en Java.
Solo me interesa saber si es posible, si realmente cumple mis objetivos, y qué tipo de heroísmo se necesitaría para hacer que eso suceda.
Utilice un ByteBuffer directo como he sugerido. ;)
En Java, la antigua forma de almacenar un secreto, como una contraseña, era usar char[]
ya que podría sobrescribir sus datos cuando terminara con él. Sin embargo, desde entonces se ha demostrado que esto es inseguro, ya que el recolector de basura copiará las cosas mientras reorganiza el montón. En ciertas arquitecturas es posible que una página sea liberada y que el secreto permanezca cuando algún otro programa asigna esa misma página.
Esto es horriblemente feo, pero ¿y si el secreto se almacenara en la pila del método de run
de un subproceso? Todavía se debe tener cuidado para terminar el hilo con gracia, de modo que pueda poner a cero sus datos, pero este problema también estaba presente en la forma anterior.
Un problema importante que veo de inmediato es que no se me ocurre una manera segura de ingresar y sacar datos del contenedor. Podría minimizar la probabilidad de un secreto filtrado utilizando flujos con buffers internos muy pequeños, pero al final terminará con el mismo problema que char[]
. [Editar: ¿Funcionaría un único miembro de private static byte
y una marca? Aunque eso te limitaría a un secreto por ClassLoader. Esto agrega más fealdad, pero podría ser bastante fácil esconderse detrás de una interfaz bien escrita.]
Así que tengo un montón de preguntas, de verdad.
¿Es la pila más segura de este tipo de ataques que el montón? ¿Hay mecanismos Java puros para realizar una copia de pila a pila entre dos marcos de pila diferentes de una manera que sería útil para este problema? Si no es así, ¿la JVM admitiría este tipo de operación en el código de bytes?
[Editar: antes de que la gente se preocupe demasiado, esto es más un experimento mental que cualquier otra cosa. No tengo ninguna intención de ''probar en producción'' o usarla en ningún proyecto actual. Me doy cuenta de que lo que estoy hablando es realmente feo, probablemente horriblemente voluminoso, y funciona en contra de toda la estructura de JVM. Solo me interesa saber si es posible, si realmente cumple mis objetivos, y qué tipo de heroísmo se necesitaría para que esto ocurra.]