chroot()
podría permitir a los usuarios malintencionados escapar de un aprisionamiento chroot.chroot()
permite a un proceso cambiar su percepción del directorio raíz del sistema de procesamiento de archivos. Después de llamar correctamente a chroot()
, un proceso no puede acceder a ningún archivo que se encuentre fuera del árbol de directorios definido por el nuevo directorio raíz. Un entorno de este tipo recibe el nombre de aprisionamiento chroot y se utiliza normalmente para impedir la posibilidad de que los procesos puedan subvertirse y usarse para obtener acceso a archivos no autorizados. Por ejemplo, muchos servidores FTP se ejecutan en aprisionamientos chroot para impedir que un usuario malintencionado que descubra una nueva vulnerabilidad en el servidor descargue el archivo de contraseñas u otros archivos confidenciales del sistema.chroot()
puede permitir a los usuarios malintencionados escaparse del aprisionamiento chroot. La función chroot()
no cambia el directorio de trabajo actual del proceso, por lo que las rutas relativas aún pueden hacer referencia a los recursos del sistema de archivos que se encuentran fuera del aprisionamiento chroot una vez que se haya llamado a chroot()
.
chroot("/var/ftproot");
...
fgets(filename, sizeof(filename), network);
localfile = fopen(filename, "r");
while ((len = fread(buf, 1, sizeof(buf), localfile)) != EOF) {
fwrite(buf, 1, sizeof(buf), network);
}
fclose(localfile);
GET
de FTP. El servidor FTP llama a chroot()
en sus rutinas de inicialización en un intento de impedir el acceso a los archivos ubicados fuera de /var/ftproot
. Sin embargo, como el servidor no cambia el directorio de trabajo actual llamando a chdir("/")
, un usuario malintencionado podría solicitar el archivo "../../../../../etc/passwd
" y obtener una copia del archivo de contraseña del sistema.exclude
. Esto es difícil de mantener y es susceptible a errores. Si los desarrolladores agregan campos nuevos al formulario o al Model
que respalda el formulario y olvidan actualizar el filtro exclude
, podrían estar exponiendo campos confidenciales a los atacantes. Los atacantes podrán enviar y enlazar datos malintencionados a cualquier campo no excluido.User
, pero controla en una lista de rechazados el id
del usuario:
from myapp.models import User
...
class UserForm(ModelForm):
class Meta:
model = User
exclude = ['id']
...
User
se actualizó con un atributo role
nuevo y el UserForm
asociado no se actualizó, el atributo role
se expondría en el formulario.SECRET_KEY
. Si la configuración SECRET_KEY
se filtra, un usuario malintencionado no solo puede falsificar los datos de sesión, sino que además, si la aplicación utiliza una subclase para serializar los datos de sesión en cookies, un usuario malintencionado podrá diseñar datos de subclase malintencionados que ejecutarán código arbitrario en el momento de deserialización.Host
se puede permitir que un usuario malintencionado envíe un valor de Host
falso que se puede utilizar para falsificación de solicitud de Cross-Site Scripting, ataques de envenenamiento de caché y envenenamiento de vínculos en correos electrónicos.*
" como una entrada en la configuración de ALLOWED_HOSTS
. django.http.HttpRequest.get_host()
utiliza esta configuración para validar el encabezado de Host
. Un valor de "*
" permitirá cualquier host en el encabezado de Host
. Un atacante podría utilizar esto en ataques de envenenamiento de caché o para el envenenamiento de vínculos en correos electrónicos.Host
para hacer referencia al sitio que facilita la función para restablecer la contraseña a fin de evitar direcciones URL con codificación rígida. Por ejemplo:
...
def reset_password(request):
url = "http://%s/new_password/?token=%s" % (request.get_host(), generate_token())
send_email(reset_link=url)
redirect("home")
...
Host
falso que señale un servidor que controla. La víctima recibirá un correo electrónico con un vínculo al sistema para restablecer contraseñas y si decide visitar el vínculo, estará visitando el sitio controlado por el usuario malintencionado que facilitará un formulario falso para recopilar las credenciales de la víctima.SECRET_KEY
se filtra, un usuario malintencionado podrá almacenar datos arbitrarios en la cookie de sesión que se deserializará en el servidor, lo que provocará la ejecución de código arbitrario.SECRET_KEY
si se codifica en el archivo de configuración settings.py
:
...
def some_view_method(request):
url = request.GET['url']
if "http://" in url:
content = urllib.urlopen(url)
return HttpResponse(content)
...
Example 1
comprueba que el parámetro url
sea una dirección URL válida al comprobar que "http://" esté presente en la dirección URL. Un atacante malintencionado podría enviar la siguiente dirección URL para filtrar el archivo de configuración settings.py
que puede contener SECRET_KEY
:
file://proc/self/cwd/app/settings.py#http://
const dns = require('dns');
// User-controlled input for DNS servers
const customDnsServers = from_user_controlled_input;
// Set custom DNS servers
dns.setServers(customDnsServers);
customDnsServers
se le asigna un valor derivado de la entrada controlada por el usuario. Esta entrada se utiliza luego para configurar los servidores DNS usandodns.setServers(customDnsServers)
. Si un atacante proporciona direcciones de servidor DNS maliciosas, puede dirigir la aplicación para que resuelva nombres de dominio utilizando sus servidores, lo que puede devolver direcciones IP falsas.Dockerfile
no especifica un USER
, los contenedores de Docker se ejecutan con privilegios de superusuario de forma predeterminada. Estos privilegios de superusuario se propagan al código que se ejecuta dentro del contenedor, que suele ser más permisivo de lo necesario. La ejecución del contenedor Docker con privilegios de superusuario amplía la superficie de ataque, lo que podría permitir a los atacantes realizar formas de explotación más graves.latest
indica automáticamente el nivel de versión de una imagen que no usa un resumen o una etiqueta única para proporcionar una versión. Docker asigna automáticamente la etiqueta latest
como mecanismo para apuntar al archivo de archivo de manifiesto más reciente. Debido a que las etiquetas son mutables, un atacante puede reemplazar una imagen o capa usando una etiqueta latest
(o etiquetas débiles comoimagename-lst, imagename-last, myimage
).ubuntu
.
FROM ubuntu:Latest
...
zypper
para que recupere la última versión del paquete dado.
...
zypper install package
...
Example 2
, si el repositorio está comprometido, un atacante podría simplemente cargar una versión que cumpla con los criterios dinámicos y provoque que zypper
descargue una versión malintencionada de la dependencia.ADD/COPY
, un atacante puede recrear cada capa del docker para obtener la información.Volumes
también puede exponer directorios confidenciales. Si necesita usar Volumes
para conservar los datos, evite montar directorios confidenciales.free()
en la misma dirección de memoria puede provocar un buffer overflow.free()
más de una vez con la misma dirección de memoria como argumento.free()
dos veces con el mismo valor, se puede producir un buffer overflow. Si un programa llama a free()
dos veces con el mismo argumento, las estructuras de datos de administración de memoria del programa se dañan. Esto puede provocar que el programa se bloquee o, en algunas circunstancias, que se realicen dos llamadas posteriores a malloc()
para devolver la misma referencia. Si malloc()
devuelve el mismo valor dos veces y el programa concede posteriormente al usuario malintencionado control de los datos escritos en la memoria que se ha asignado dos veces, el programa será vulnerable a un ataque de buffer overflow.
char* ptr = (char*)malloc (SIZE);
...
if (abrt) {
free(ptr);
}
...
free(ptr);
...
user_ops = request->get_form_field( 'operation' ).
CONCATENATE: 'PROGRAM zsample.| FORM calculation. |' INTO code_string,
calculator_code_begin user_ops calculator_code_end INTO code_string,
'ENDFORM.|' INTO code_string.
SPLIT code_string AT '|' INTO TABLE code_table.
GENERATE SUBROUTINE POOL code_table NAME calc_prog.
PERFORM calculation IN PROGRAM calc_prog.
...
operation
es un valor benigno. Sin embargo, si el atacante especifica operaciones de idioma que son válidas y maliciosas al mismo tiempo, dichas operaciones se ejecutarán con todos los privilegios del proceso primario. Estos ataques llegan a ser más peligrosos cuando el código que se inyecta accede a recursos del sistema o ejecuta comandos del sistema. Por ejemplo, si un usuario malintencionado especifica "MOVE 'shutdown -h now' to cmd. CALL 'SYSTEM' ID 'COMMAND' FIELD cmd ID 'TAB' FIELD TABL[]." como valor de operation
, se ejecutaría un comando de apagado en el sistema host.
...
var params:Object = LoaderInfo(this.root.loaderInfo).parameters;
var userOps:String = String(params["operation"]);
result = ExternalInterface.call("eval", userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso, a la variable result
se le asigna un valor de 22. Sin embargo, si un usuario malintencionado especifica operaciones de lenguaje que son válidas y malintencionadas, dichas operaciones deberían ejecutarse con todos los privilegios del proceso principal. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de ActionScript, el atacante podría utilizar esta vulnerabilidad para ejecutar un ataque XSS (Cross-Site Scripting).
...
public static object CEval(string sCSCode)
{
CodeDomProvider icc = CodeDomProvider.CreateProvider("CSharp");
CompilerParameters cparam = new CompilerParameters();
cparam.ReferencedAssemblies.Add("system.dll");
cparam.CompilerOptions = "/t:library";
cparam.GenerateInMemory = true;
StringBuilder sb_code = new StringBuilder("");
sb_code.Append("using System;\n");
sb_code.Append("namespace Fortify_CodeEval{ \n");
sb_code.Append("public class FortifyCodeEval{ \n");
sb_code.Append("public object EvalCode(){\n");
sb_code.Append(sCSCode + "\n");
sb_code.Append("} \n");
sb_code.Append("} \n");
sb_code.Append("}\n");
CompilerResults cr = icc.CompileAssemblyFromSource(cparam, sb_code.ToString());
if (cr.Errors.Count > 0)
{
logger.WriteLine("ERROR: " + cr.Errors[0].ErrorText);
return null;
}
System.Reflection.Assembly a = cr.CompiledAssembly;
object o = a.CreateInstance("Fortify_CodeEval.FortifyCodeEval");
Type t = o.GetType();
MethodInfo mi = t.GetMethod("EvalCode");
object s = mi.Invoke(o, null);
return s;
}
...
sCSCode
es un valor benigno, como "return 8 + 7 * 2", en cuyo caso 22 es el valor de devolución de la función CEval
. Sin embargo, si el atacante especifica operaciones de idioma que son válidas y maliciosas al mismo tiempo, dichas operaciones se ejecutarán con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, .Net permite invocar las API de Windows. Si un atacante especifica "return System.Diagnostics.Process.Start(\"shutdown\", \"/s /t 0\");" como el valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, JavaScript permite la invocación de objetos Java. Si un usuario malintencionado especifica " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable calcResult
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de JavaScript, el atacante puede utilizar esta vulnerabilidad para realizar un ataque de secuencias entre sitios.
...
@property (strong, nonatomic) WKWebView *webView;
@property (strong, nonatomic) UITextField *inputTextField;
...
[_webView evaluateJavaScript:[NSString stringWithFormat:@"document.body.style.backgroundColor="%@";", _inputTextField.text] completionHandler:nil];
...
<body>
de webView
debería tener como estilo un fondo azul. Sin embargo, si un usuario malintencionado proporciona una entrada malintencionada todavía válida, podría ser capaz de ejecutar código JavaScript arbitrario. Por ejemplo, dado que JavaScript puede obtener acceso a determinado tipo de información privada, como las cookies, si un usuario malintencionado especificara "white";document.body.innerHTML=document.cookie;"" como entrada de UITextField, la información de cookie se escribiría en la página de manera visible. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema, como cuando el código inyectado se ejecuta con todos los privilegios del proceso primario.
...
$userOps = $_GET['operation'];
$result = eval($userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso a la variable result
se le asigna un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especificara "exec('shutdown -h now')" como el valor de operation
, se ejecutaría en el sistema host un comando de apagado.
...
userOps = request.GET['operation']
result = eval(userOps)
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso a la variable result
se le asigna un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especificara "os.system('shutdown -h now')" como el valor de operation
, se ejecutaría en el sistema host un comando de apagado.
...
user_ops = req['operation']
result = eval(user_ops)
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Con Ruby esto se permite y, dado que se pueden ejecutar varios comandos delimitando las líneas con un punto y coma (;
), también habilitaría la ejecución de múltiples comandos con una sola inyección, sin romper el programa por ello.operation
"system(\"nc -l 4444 &\");8+7*2", se abriría el puerto 4444 para escuchar una conexión en el equipo y seguiría devolviendo el valor de 22 a result
...
var webView : WKWebView
var inputTextField : UITextField
...
webView.evaluateJavaScript("document.body.style.backgroundColor="\(inputTextField.text)";" completionHandler:nil)
...
<body>
de webView
debería tener como estilo un fondo azul. Sin embargo, si un usuario malintencionado proporciona una entrada malintencionada todavía válida, podría ser capaz de ejecutar código JavaScript arbitrario. Por ejemplo, dado que JavaScript puede obtener acceso a determinado tipo de información privada, como las cookies, si un usuario malintencionado especificara "white";document.body.innerHTML=document.cookie;"" como entrada de UITextField, la información de cookie se escribiría en la página de manera visible. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema, como cuando el código inyectado se ejecuta con todos los privilegios del proceso primario.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
es "8 + 7 * 2". La variable strResult
devuelve un valor de 22. Sin embargo, si un usuario especifica otras operaciones de lenguaje válidas, esas no solo se ejecutan, sino que lo hacen con todos los privilegios del proceso principal. La ejecución de código arbitraria será más peligrosa cuando el lenguaje subyacente proporcione acceso a los recursos del sistema o permita la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especifica operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" se ejecutaría un comando de apagado en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
ScriptContext newContext = new SimpleScriptContext();
Bindings engineScope = newContext.getBindings(request.getParameter("userName"));
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps,newContext);
...
page_scope
es el nombre de usuario previsto. Sin embargo, si un atacante especifica el valor para GLOBAL_SCOPE
, las operaciones tendrán acceso a todos los atributos de todos los motores creados por el mismo ScriptEngine
.script
:
<script src="http://www.example.com/js/fancyWidget.js"></script>
www.example.com
para cargar su propio JavaScript.
...
String address = request.getParameter("address");
Properties props = new Properties();
props.put(Provider_URL, "rmi://secure-server:1099/");
InitialContext ctx = new InitialContext(props);
ctx.lookup(address);
...
string name = Request["username"];
string template = "Hello @Model.Name! Welcome " + name + "!";
string result = Razor.Parse(template, new { Name = "World" });
...
operation
es un valor benigno, como "John", en cuyo caso la variable result
se asigna a un valor de "Hello World! Welcome John!". No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, Razor permite la invocación de objetos C#; si un atacante especificase " @{ System.Diagnostics.Process proc = new System.Diagnostics.Process(); proc.EnableRaisingEvents=false; proc.StartInfo.FileName=\"calc\"; proc.Start(); }" como el valor de name
, se ejecutaría un comando del sistema en el sistema host.
...
ScriptEngineManager scriptEngineManager = new ScriptEngineManager();
ScriptEngine scriptEngine = scriptEngineManager.getEngineByExtension("js");
userOps = request.getParameter("operation");
Object result = scriptEngine.eval(userOps);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable result
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. Por ejemplo, JavaScript permite la invocación de objetos Java. Si un usuario malintencionado especifica " java.lang.Runtime.getRuntime().exec("shutdown -h now")" como valor de operation
, se ejecutará un comando de apagado en el sistema host.
...
userOp = form.operation.value;
calcResult = eval(userOp);
...
operation
es un valor benigno, como "8 + 7 * 2", en cuyo caso la variable calcResult
se asigna a un valor de 22. No obstante, si un atacante especifica operaciones de idiomas que sean tanto válidas como maliciosas, estas operaciones se ejecutarían con todos los privilegios del proceso primario. Estos ataques son incluso más peligrosos cuando el lenguaje subyacente proporciona acceso a los recursos del sistema o permite la ejecución de comandos del sistema. En el caso de JavaScript, el atacante puede utilizar esta vulnerabilidad para realizar un ataque de secuencias entre sitios.
...
strUserOp = Request.Form('operation')
strResult = Eval(strUserOp)
...
operation
es "8 + 7 * 2". La variable strResult
devuelve un valor de 22. Sin embargo, si un usuario especifica otras operaciones de lenguaje válidas, esas no solo se ejecutan, sino que lo hacen con todos los privilegios del proceso principal. La ejecución de código arbitraria será más peligrosa cuando el lenguaje subyacente proporcione acceso a los recursos del sistema o permita la ejecución de comandos del sistema. Por ejemplo, si un usuario malintencionado especifica operation
como " Shell('C:\WINDOWS\SYSTEM32\TSSHUTDN.EXE 0 /DELAY:0 /POWERDOWN')" se ejecutaría un comando de apagado en el sistema host.Delegate
en una clase determinada introduce una vulnerabilidad de ejecución de código arbitrario al deserializar la clase.Delegate
se utiliza para contener la referencia a una llamada a un método que se puede invocar más adelante en el código de usuario. .NET utiliza serialización personalizada durante los tipos de serialización Delegate
y utiliza la clase System.DelegateSerializationHolder
para almacenar la información del método que está adjunto o suscrito a un Delegate
. El flujo serializado del objeto Delegate
no es adecuado para el almacenamiento persistente o para pasarlo a una aplicación remota, porque si un atacante puede reemplazar la información del método con una que apunte a un gráfico de objeto malicioso, el atacante podrá ejecutar un código arbitrario.Delegate
y se invoca en el método Executor
:
...
[Serializable]
class DynamicRunnner
{
Delegate _del;
string[] _arg;
public DynamicRunnner(Delegate dval, params string[] arg)
{
_del = dval;
_arg = arg;
}
public bool Executor()
{
return (bool)_del.DynamicInvoke(_arg);
}
}
...
Example 1
, un atacante podría sustituir la información del método con información que apuntase a Process.Start
, con lo que se crearía un proceso arbitrario cuando se llamase al método Executor
.BeanUtilsHashMapper
para deserializar hashes de Redis que pueden permitir que los atacantes que controlen dichos hashes ejecuten código arbitrario.
HashMapper<Person, String, String> hashMapper = new BeanUtilsHashMapper<Person>(Person.class);
Person p = hashMapper.fromHash(untrusted_map);