6 ago 2013

Seguridad y PowerShell (Parte V)

Los datos sensibles deben siempre estar almacenados y tratados de manera segura y nunca como texto plano. Esta afirmación es una premisa en el ámbito de la seguridad de la información. PowerShell se basa en .NET Framework para la securización de las cadenas de texto.

Hay que distinguir entre cadena cifrada y cadena segura. Vamos a analizar las características y la vía de gestionar las cadenas seguras. Pero, antes ¿Qué es una cadena segura?

  • Contenido cifrado. El framework se encargará de cifrar carácter por carácter.
  • Acceso controlado. Las cadenas de texto tienen como propiedad que se podrá anexar carácter a carácter. Si intentamos agregar más de un carácter se generará un error.
  • No duplicación. Las cadenas seguras no se duplican en memoria, para evitar la pérdida de control sobre la información crítica en RAM. Están fuera del alcance del recolector de basura de PowerShell, ya que éste podría duplicar la información.

Vamos a crear cadenas seguras

Cuando un script recoge un valor sensible que es requerido al usuario. El cmdlet Read-Host dispone de un parámetro para proteger mediante la transformación de la cadena de entrada en una cadena segura la información. Ese parámetro es assecurestring. Esto es realmente interesante para evitar que la información quede expuesta en RAM.

El objeto no puede leerse directamente, la cadena está protegida. Existe otra manera de crear las cadenas seguras, pero que llevan explícitamente la cadena de texto en plano, por lo que no se recomienda su uso en scripting. El cmdlet ConvertTo-SecureString permite la creación de una cadena segura a partir de una cadena de texto plano. Se puede visualizar en este ejemplo convertto-securestring ‘prueba’ –asplaintext –force. Los parámetros asplaintext y force son necesarios e imprescindibles en la creación de la cadena segura. Los objetos SecureString disponen de métodos para tratar a éstos.

  • AppendChar Anexa un carácter a la cadena segura $sec.AppendChar(‘x’)
  • Copy Copia el objeto que contiene la cadena segura $sec2 = $sec.Copy()
  • MakeReadOnly El contenido se hace constante. No puede ser modificado $sec.MakeReadOnly()
  • $sec.RemoveAt(<posición>)
Existe una curiosidad y es que si se crean 2 cadenas seguras que albergan el mismo texto, un atacante malicioso podría intentar realizar fuerza bruta sobre ellas. Pero en PowerShell el mismo texto cuando es pasado a cadena segura no es el mismo objeto, por lo que si se aplicase el método equals sobre ambos objetos el valor devuelto sería false.
¿Cómo se leen las cadenas seguras?

Para leer las cadenas seguras se utiliza un método en el que el recolector de basura de PowerShell no pueda intervenir en una zona de memoria determinada. Es decir, se copiará el valor de la cadena segura a una zona de memoria dónde el recolector no tenga acceso para que éste no pueda copiar el valor en otra zona sin el consentimiento del usuario. Después con PtrToStringUni se duplicará el contenido de la cadena pero ya en plano. Hay que utilizar rápidamente el valor que se ha recuperado y eliminar el puntero a la zona de memoria no gestionada por el recolector, y la modificación de la cadena en claro cuando ya no se necesite.

En el libro de PowerShell: La navaja suiza de los administradores de sistemas se puede obtener más información sobre la seguridad aplicada con esta línea de comandos.

1 comentario:

  1. [...] Seguridad y PowerShell (Parte V): Los datos sensibles deben siempre estar almacenados y tratados de manera seg... http://t.co/CLmGK19Ohq  [...]

    ResponderEliminar