Jak zabránit útokům přetečení vyrovnávací paměti
Krok 1
Napište bezpečnostní kód, abyste se vyhnuli přetečení. V prostředí C existuje řada funkcí zranitelnosti, které mohou hackeři využít k překročení vyrovnávacích pamětí. Minimalizujte používání strcpy (), strcat (), sprintf () a vsprintf (), která nekontroluje limity. Je-li to možné, vyhněte se použití metody get (), která neurčuje, kolik znaků je třeba číst, a tím ponechte váš kód zranitelný. Pokud používáte scanf (), nezapomeňte určit šířku pro formát% s, abyste zabránili přetečení.
Krok 2
Zkontrolujte, zda můžete použít trampolíny, abyste zabránili přetečení vyrovnávací paměti. Vzhledem k tomu, že přetečení vyrovnávací paměti se vyskytuje v zásobách paměti a není v kódu, zdá se, že nejjednodušším řešením je zabránit tomu, aby hromady prováděly jakýkoli kód vložením malého úryvku kódu, který by zakázal tyto akce. To je možné v Linuxu, ale je to velmi obtížné. Pouze několik kompilátorů používá malé kousky kódu označované jako trampolíny, které působí jako bariéra mezi kódem volání funkcí a funkcí samotnou. Pokud se tedy škodlivý kód pokusí nahradit vyrovnávací paměť, může trampolína zachytit a neutralizovat pokusy hackerů.
Krok 3
Implementujte nástroje pro kompilaci, které vám dávají upozornění, když používáte kód, který vám znemožňuje útoky. Některé z těchto nástrojů vygenerují kód, který zakazuje cizincům přístup k nelegálním adresám a vypíná kód, který se pokouší o takové provedení. Produkty jako StackShield a StackGuard jsou velkou pomocí. StackSheild analyzuje návratovou adresu funkce a ukončí ji v případě nesrovnalosti. StackGuard umístí kanárské slovo na adresu odesílatele a zkontroluje, zda bylo slovo změněno, a ukončí funkci, když ji má.
Krok 4
Nainstalujte nástroje, jako je libsafe, pro kontrolu zabezpečení v dynamickém prostředí běhu. Program Libsafe běží v systému Linux a kontroluje nejbližší návratovou adresu rámce zásobníku, poté se ujistěte, že adresa není přepisována. Libsafe také nahradí nesystémové funkce, jako jsou get (), strcpy () a scanf ().