Názor k článku Postřehy z bezpečnosti: vkládáme kód pomocí AtomBombingu od Martin Dráb - Abyste mohl poslat APC cizímu vláknu, musíte na...

  • Článek je starý, nové názory již nelze přidávat.
  • 31. 10. 2016 12:32

    Martin Dráb
    Stříbrný podporovatel

    Abyste mohl poslat APC cizímu vláknu, musíte na něj mít handle s oprávněním THREAD_SET_CONTEXT. Je pravda, že pokud zdrojová i cílová aplikace běží pod stejným uživatelem a na stejné integrity level, tak se to dělá poměrně těžko a nebude to zrovna bezpečné vzhledem k zachování funkčnosti programu. Vlákno je objekt jádra, tedy na něj platí bezpečnostní model.

    Navíc, aby vlákno vykonávalo APC, musí se dostat do "alertable" stavu. Ne všechna vlákna v takovém stavu jsou.

    Zasílání zpráv byl problém... a asi stále ještě je, i když se tam také věci zlepšily (UIPI). Na druhou stranu, posílat si zprávou adresy funkcí, které pak bez kontroly zavolám, mi nepřijde jako zrovna správné řešení, když je již známo, že ty zprávy mohou přijít skoro odkudkoliv. Ale stále jsou takové aplikace.

    SetThreadContex­t/QueueUserApc jsou funkce notoricky známé pro provádění injekcí kódu (resp. jeho spuštění), takže pokusy o získání oprávnění THREAD_SET_CONTEXT neujdou pozornosti kvalitnějšímu IPS/IDS.

    Doručení APC vláknu nejprve znamená spuštění rutiny v ntdll.dll, kterou si může aplikace modifikovat tak, aby věděla o každém APC a případně je dokázala filtrovat (podobně např. pokusy o sledování jí zasílaných zpráv či keylogging skrz Windows Hooks). Bránit se dá, ale není ani snadné ani dokumentované (resp. oficiálně dokumentované).