Simovits

Ett slag för Linux och hur man kan besegrar elaka kaniner

I en tidigare blogg visade jag ett simpelt exempel på vad en Bash Bunny kan göra ( https://simovits.com/en-elak-kanin/) . I denna blogg tänkte jag skriva om hur enkelt det är att skydda sig mot dessa typer av attacker, speciellt om man kör Linux och har framförhållning.

Nyfiken i en strut

Så låt oss säga att du har hittat en USB sticka och undrar vad som är på den. Kanske är det senaste avsnittet av Game Of Thrones som någon okänd person har tappat? Men innan du kopplar in den okända stickan så kommer du ihåg att det i princip är möjligt att stickan kan innehålla andra betrodda USB enheter, så som tangentbord eller USB Ethernet adapter (för att inte tala om skadlig kod men de har du såklart redan stenkoll på med världens bästa antivirusskydd). Hur ska du göra för att ta del av innehållet utan att bekymra dig om att andra enheter kanske gömmer sig i stickan?

Steg 1 – Kör Linux 🙂

Det första steget är det viktigaste, och enklaste, kör Linux. Detta är alltid ett bra tips, oavsett situation 🙂 Dagens Linux distributioner är både stabila, snabba, snygga och överlag säkra. Ett tips är distributionen Solus (https://getsol.us/home/ ), som har flera fördelar, däribland ofta uppdaterade mjukvarupaket. (Inom Windowsmiljöer går det att skydda sig mot dessa attacker, men tillvägagångssättet är mycket mer komplicerat samt mindre tillförlitligt.)

Steg 2 – Anpassa moduler i Linuxkärnan

I Linux bygger alla former av ”drivrutiner” på förekomsten av specifika moduler (modules) i kärnan. Det mest effektiva sättet att förhindra ”bash bunny” typer av attacker är därför att se till att Linux kärnan saknar stöd för dessa enheter. Detta kan åstadkommas på två olika sätt

Det sista alternativet är närmast principen av ”whitlisting” vilket är att föredra framför blacklisting. Med whitlisting går det att förhindra okända moduler (och därav härmande av enheter) utan att direkt känna till dem. Dessutom motsvarar det alternativet en mindre arbetsbörda, vilket alltid är skönt. Om dessa saker låter komplicerade så befara inte, de faktiska kommandona går lätt att komma ihåg och automatisera.

Följande kärnkommandon är nödvändiga:

lsmod [listar alla moduler som är inladdade i kärnan just nu] 

modinfo NAMN [en beskrivning av modulen, omfattning varierar mellan modulerna]

sudo modprobe -r NAMN [plockar ut modulen ur kärnan] 

sudo sysctl kernel.modules_disabled=1 [kontrollerar kärnas parametrar medans den kör, stänger av möjligheten att ladda in nya moduler] 

Notera att det sista kommandot gäller fram tills systemet startas om, vilket innebär att det inte går att ändra det utan omstart. Ihop kan man använda dessa kommandon för att lista, plocka ur och stoppa moduler samt dess laddande.

Steg 3 – Skriv ett skript

Om man vill kunna återupprepa detta ofta och mycket så är det bäst att skriva ett skript. Nedan följer ett simpelt skrivit skript som illustrerar metodiken (notera att detta är ett Bourne skript vilket innebär att det saknar många av de snofsiga funktioner som Bash har, samtidigt är det dock mer portabelt).

#!/bin/sh
# module minimisation section
number=$(lsmod | awk '{print $1}' | wc -l)
#Counting one to many because of the module word in the beginning
((number = number -1))
#echo $number
echo "This program will guide you through module minimisation"
echo
echo
echo "What kind do you want?(1/2)"
echo "1 - Auto USB minimisation"
echo "2 - Custom guided minimisation"
read choice
if [ "$choice" = 1 ]
	then
	echo "Starting auto USB module minimisation...."
	modprobe -r mac_hid
	#modprobe -r hid_generic
	#modprobe -r usbhid
	#modprobe -r hid
elif [ "$choice" = 2 ]
then
echo "Starting guided module minimisation...."
#
for i in $(seq 2 1 $number)
do    
    	# we must make sure that we can pass the variable into awk 
    	element=$(lsmod | awk -v i="$i" 'NR==i{print $1}')
    	filename=$(modinfo $element | grep filename)
	echo Module name:$element
	echo $filename
	modinfo $element | grep description
	echo "Do you want to unload (remove) this module?(y/n)"
	read input
	if  [ "$input" = y ]
		then
			echo "unloading module...."
			modprobe -r $element
			echo
		else
			echo "Proceeding to next module...."
			echo
	fi
done
else
echo "Non-valid input, restart the script"
fi
#After removing unwanted modules, we turn off the ability for the kernel to load in any new modules
# Below is to ensure that USB storage devices can be connected
modprobe usb_storage
modprobe uas
sysctl kernel.modules_disabled=1
echo
echo "Module minimising done. Note that the ability to load new modules (such as those related to a USB keyboard) cannot be done until a reboot takes place"
sleep 2
echo   

Här har jag två alternativ, där alternativ 1 svarar mot motverkande av USB tangentbord. Iden är att man kollar igenom alla inladdade moduler för sådana som inte är önskade. För tangentbord bör alla moduler som innehåller referenser till HID (Human interface device) tas bort, eftersom dessa svarar mot tangentbord och andra betrodda enheter som automatiskt monteras till operativsystemet.

Trägen vinner

Nu går det alltså att koppla in en USB sticka utan att frukta att kommandon injiceras genom ett härmat tangentbord. På en ordinarie bärbar dator är det vanliga tangentbordet inte anslutet via USB, så denna metod går att använda utan att egentligen påverka det vanliga användandet av datorn. För stationära kan man gå tillbaka till ett trevligt PS/2 tangentbord och sedan köra denna metod.

I båda fallen så kan du nu koppla in stickan i hoppet om att hitta nästa avsnitt av Game of Thrones. Självfallet kan detta förfarande även användas om man är rädd för andra enheter. Så länge dessa bygger på att drivrutiner behöver laddas in som moduler i Linuxkärnan så fungerar denna metod. Ett ganska effektivt sätt att minska attackvektorer skulle jag nog säga, dessutom får man möjlighet att köra Linux vilket alltid är trevligt 🙂