netcat의 보안

netcat의 보안

사용자가 내 가상화 호스트에서 VM을 강제 재설정할 수 없다는 불만을 자주 받습니다. 그래서 사용자에게 QEMU 콘솔에 대한 전체 액세스 권한을 부여하지 않고 VM을 종료하는 방법을 설정하기로 결정했습니다. 내 생각은 다음과 같습니다.

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

$USERPORT모든 사용자의 개인 트리거 포트입니다. 해당 포트에 대한 연결은 stunnel인증서 기반 인증을 통해 보호됩니다 . 프로덕션 수준에서 보안이 유지되나요? 내 말은, netcat이와 같이 실행되는 서버가 일종의 버퍼 호깅 등으로 악용될 수 있다는 뜻입니까? 나는 반드시 권한 상승에 대해 말하는 것이 아니라 모든 형태의 심각한 시스템 불안정화에 대해서도 이야기하고 있습니다. RAM이나 다른 것을 채워서.

편집하다:

초기 응답은 매우 상세하고 일반적인 bash 스크립팅과 관련되어 있으므로 실제 스크립트를 게시할 것 같습니다(위의 코드는 너무 자세히 설명하는 것을 피하기 위해 의사 코드와 비슷했습니다).

#!/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

답변1

USERPORT실제 QEMUCONSOLE내보낸 환경 변수 입니까 ? 그렇지 않으면 "쉘 스크립트의 변수에 대한 명명 규칙이 있습니까?"

그리고 보안이 걱정되시는데, 이에 대해 알고 계시나요?bash/POSIX 쉘에서 변수를 인용하는 것을 잊어버린 경우의 보안 영향?

nc다음으로, 여기의 첫 번째 명령이 해당 포트에 바인딩할 수 없는 경우(예: 다른 프로세스가 이미 해당 포트에서 수신 대기 중인 경우) 의미를 고려해 보셨나요 ? 어떤 식으로든 종료 상태를 확인하지 않습니다. QEMUCONSOLE에 초당 엄청난 횟수의 "quit"을 보내는 연속 루프가 발생할 것으로 예상됩니다.

나는 그렇다고 말할 것이다.~ 아니다생산 준비 완료. 나는 아직 "보안"에 대해 걱정하지 않을 것입니다. 왜냐하면 당신은 처음에 기본적인 엣지 케이스를 처리하지 않았기 때문입니다.부서지기 쉬운원격으로 악용할 수 있는지 여부에 관계없이.

관련 정보