Seguridad de netcat

Seguridad de netcat

Recibo quejas con bastante frecuencia de que los usuarios no pueden restablecer sus máquinas virtuales en mi host de virtualización. Así que decidí configurar alguna forma de eliminar la VM, sin dar acceso completo a la consola QEMU a los usuarios. Aquí está mi idea:

while true ; do
  nc -l $USERPORT > /dev/null
  echo "quit" | nc 127.0.0.1 $QEMUCONSOLE
done

$USERPORTes el puerto de activación personal de cada usuario. La conectividad a dicho puerto está protegida mediante stunnelautenticación basada en certificados. ¿Es seguro a nivel de producción? Quiero decir, ¿se puede netcatexplotar un servidor que se ejecuta de esta manera con algún tipo de acaparamiento del búfer, etc.? No me refiero necesariamente a una escalada de privilegios, sino también a cualquier forma de desestabilización grave del sistema, por ejemplo. llenando RAM o algo así.

EDITAR:

Dado que la respuesta inicial fue bastante detallada y estaba relacionada con las secuencias de comandos bash generales, supongo que publicaré la secuencia de comandos real (el código anterior era más como un pseudocódigo ya que quería evitar entrar en demasiados detalles).

#!/bin/bash

if [ ! -e "$HOME/kvm" ] ; then
        >&2 echo "kvm dir not detected - creating"
        /common/spawnVM.sh
        if [ x"$?" != x"0" ] ; then
                >&2 echo "qemu image creation failed - aborting"
                exit 1 ; fi
fi

cd $HOME

VNCDISP=`cat /common/stunnelsrv.conf | grep "\[.*\]\|connect" | sed -e '$!N;s/\n/ /' | grep "^\[${USER:2}\]" | grep -o ":[0-9]\+" | grep -o "[0-9]$"`
if [ x"$VNCDISP" = x""  ] ; then
        >&2 echo "stunnel section not found"
        exit 2 ; fi

MONITORPORT="6`printf '%.3d' $VNCDISP`"

CMDPORT=`cat /common/stunnelsrv.conf | grep "\[.*\]\|connect" | sed -e '$!N;s/\n/ /' | grep "^\[cmd-${USER:2}\]" | grep -o ":[0-9]\+" | grep -o "[0-9]\+"`

TAPNAME="tap${USER:2}"
ip link show dev "$TAPNAME" > /dev/null
if [ x"$?" != x"0" ] ; then
        >&2 echo "tap device not found"
        exit 3 ; fi

NICMACADDR="`/common/qemu-mac-hasher.py \"$USER\"`"

CDISO=/common/arch.iso
if [ -e ./kvm/boot.iso ] ; then
        CDISO=./kvm/boot.iso ; fi

if [ x"$CMDPORT" = x""  ] ; then
        >&2 echo "stunnel cmd section not found - skip"
else
        {
                nc -l 127.0.0.1 -p "$CMDPORT" > /dev/null
                if [ x"$?" != x"0" ] ; then
                        >&2 echo "error occured while running cmd"
                else
                        echo "quit" | nc 127.0.0.1 "$MONITORPORT"
                fi
        } &
fi

echo "Params: VNC :$VNCDISP TAP $TAPNAME MAC $NICMACADDR MONITOR $MONITORPORT CMD $CMDPORT"
DISPLAY=:0

qemu-system-x86_64 -enable-kvm -machine type=pc,accel=kvm -monitor telnet:127.0.0.1:$MONITORPORT,server,nowait \
        -nographic -vga virtio -vnc 127.0.0.1:$VNCDISP -usbdevice tablet -cpu host -smp 2 -m 4G -device virtio-balloon \
        -boot menu=on -cdrom $CDISO -drive file=./kvm/root-$USER.img,format=qcow2,if=virtio,cache=off \
        -net nic,model=virtio -net tap,ifname=$TAPNAME,script=no,downscript=no

echo "Waiting for reboot interrupt... ($0)"
sleep 10

exec $0
exit 0

Respuesta1

USERPORT¿ Son QEMUCONSOLEvariables ambientales exportadas reales? Si no ve "¿Existen convenciones de nomenclatura para las variables en los scripts de shell?"

Además, dado que le preocupa la seguridad, ¿es consciente de lasImplicaciones de seguridad de olvidarse de citar una variable en shells bash/POSIX?

A continuación, ¿ha considerado las implicaciones si el primer nccomando aquí no puede vincularse a ese puerto (por ejemplo, si otro proceso ya está escuchando en el puerto)? No verifica su estado de salida de ninguna manera. Esperaría que obtuviera un bucle continuo que enviara "salir" a QEMUCONSOLE una gran cantidad de veces por segundo.

Yo diría que esnolisto para producción. Ni siquiera me preocuparía por "seguro" todavía porque, en primer lugar, no has manejado casos extremos básicos, por lo que esfrágilindependientemente de si se puede explotar remotamente o no.

información relacionada