¿El recolector de basura libera el recurso "mm"?
Una vez que está muerto, sí. Finalmente, el GC se ejecutará y liberará la memoria si no se referencia.
¿Es esto un riesgo de seguridad?
Seamos precisos en nuestra terminología. Un activo tiene algo de valor: datos privados, la hora de un usuario, etc. Un atacante es alguien que desea dañar el activo. Una amenaza es la manera en que el atacante podría causar daño. Una vulnerabilidad es un aspecto del escenario que el atacante podría aprovechar para corregir la amenaza.
Para responder a su pregunta que necesitamos saber:
- ¿Cuál es la ventaja?
- ¿Quién es el atacante?
- ¿Cuál es la amenaza que representa el atacante para el activo?
- ¿Qué vulnerabilidad puede aprovechar el atacante para compensar la amenaza?
Solo una vez que establezca las respuestas a esas preguntas, podemos saber si la falla de liberar inmediatamente un búfer de memoria ante una excepción es un riesgo de seguridad.
Para un ejemplo del mundo real, el activo podría ser mi televisión, el atacante podría ser un ladrón, la amenaza es un robo, y la vulnerabilidad es una ventana del segundo piso desbloqueada y la escalera en mi garaje. La escalera y la ventana son ambos parte de una vulnerabilidad a esa amenaza. Sin embargo, ninguno de ellos es una vulnerabilidad a la amenaza de, por ejemplo, incendio premeditado. ¡No puede determinar el riesgo de un aspecto particular de una situación hasta que sepa cuál es la amenaza realista!
Sé que es una buena práctica liberar explícitamente cualquier recurso asignado.
Es una buena práctica para limpiar explícitamente no administrados recursos, como identificadores de archivo que son controlados por el sistema operativo. Normalmente permite que el recolector de basura limpie la memoria administrada.
Tal vez me equivoque, pero no están de acuerdo en su totalidad con el último párrafo. Aparte del 'Dispose()' de 'MemoryStream' que no hace mucho (no hay recursos no administrados), ya que no hay referencia al' MemoryStream', no hay diferencia entre una excepción o una salida normal, y un DoS en tal método simplemente invocaría el GC más de lo necesario. Creo que si tienes una vulnerabilidad DoS, este no es tu mayor problema. ¿Estás de acuerdo o tienes una opinión diferente? –
@Pieter: Pido disculpas por no comprender lo que dices, pero intentaré responder: Estoy de acuerdo en que debes "Eliminar" un "MemoryStream"; "vacía" el búfer y cierra la secuencia, impidiendo cualquier escritura adicional (suponiendo que se estaba utilizando para escribir). Pero creo que el asker original solo estaba usando 'MemoryStream' como ejemplo para cualquier memoria asignada; podría haber sido fácilmente 'nuevo Foo' y habría significado lo mismo para su pregunta. – Randolpho
@Pieter (cont): Como dijiste, no hay diferencia entre una excepción y una salida normal, aparte del flujo del programa, y estoy de acuerdo en que si hay una vulnerabilidad DoS, es probable que se encuentre en otra parte. Creo que en la mayoría de los casos, la asignación de memoria durante una llamada a un método (con 'new Anything()') no constituye una vulnerabilidad DoS, a menos que su método sea especialmente malo para asignar mucha memoria transitoria. Incluso entonces, eso es menos "vulnerabilidad DoS" y más "programación descuidada". – Randolpho