2010-03-02 21 views
5

Przeczytałem, że instrukcje "Zwykłe" ARM mają stałą długość - 32 bity. I że żadna instrukcja ARM nie może przeskoczyć do środka innej instrukcji - co jest łatwe do zrobienia przy pomocy instrukcji x86.Czy ARM jest bezpieczniejszym zestawem instrukcji?

(dla x86, NaCl Google stara się „naprawić” ten wyrównując instrukcje dotyczące granicach 32 bajtów).

Czy programy ARM ten sposób bardziej bezpieczny lub bardziej odporne na pewne ataki?

Jeśli tak, czy to dotyczy instrukcji Thumb i Java?

+5

Jeśli atakujący jest w pozycji, w której może spowodować, że licznik programu nie będzie ustawiony zgodnie z instrukcjami, prawdopodobnie już wykorzystuje lukę w zabezpieczeniach w innym miejscu, więc bezpieczeństwo systemu zostało już naruszone. –

+0

Czy to możliwe z kodem ARM? – philcolbourn

Odpowiedz

3

Miejsce, w którym może być bezpieczniejsze, to skanowanie z opkodu do procesu piaskownicy. Jeśli chcesz zabronić lub przechwycić niektóre instrukcje, to jest to łatwiejsze w przypadku zestawu instrukcji o stałej długości. W architekturze x86 zestaw instrukcji zależy od kontekstu, a instrukcja ma zmienną długość, więc instrukcja, która wydaje się nieszkodliwa, może w rzeczywistości osadzić inną instrukcję, jeśli przeanalizuje się ją z poprawnego przesunięcia. Możesz skutecznie "przeskoczyć w środku instrukcji" i nadal mieć ważną instrukcję.

ARM jest łatwiej analizować, a tryb kciuka tego nie zmienia. Zestaw instrukcji ARM nie jest szczególnie bezpieczny sam w sobie, ale jest o wiele łatwiejszy do analizowania, a poprawne analizowanie jest konieczne dla produktu NaCl, jak np. Piaskownica

To jest krótka i prawdopodobnie nieścisła odpowiedź. Aby uzyskać bardziej jednoznaczną odpowiedź, spójrz na to: blog post na doskonałym blogu matasano

1

Zastanawiasz się nad atakiem przekierowania adresu zwrotnego stosu lub podobnego, aby rozgałęzić się na prawo ładunku? Wyrównanie słów nie jest wielką pomocą ani żadną przeszkodą, jaką sobie wyobrażam - wystarczy wyrównać ładunek 4 bajtów. Aha, i x64 wymaga wyrównania 16 bajtów.

Czy to masz na myśli? Dzięki!

+0

8-bajt? (8 bit x 8 = 64 bit) – helios

+0

Myślę, że NaCl firmy Google używa 32-bajtowego wyrównania w trybie 32-bitowym. Nie działają (obecnie?) Obsługują tryb 64-bitowy. http://nativeclient.googlecode.com/svn/data/docs_tarball/nacl/googleclient/native_client/documentation/nacl_paper.pdf http://code.google.com/p/nativeclient/ – philcolbourn

+2

x64 (podobnie jak x86) ma w ogóle nie wymagają dostosowania instrukcji. Niektóre instrukcje (SSE) wymagają dopasowania ich ** danych ** do 16 bajtów. Ale na pewno instrukcje same w sobie nie muszą być wyrównane. Wiele z nich ma jednak jeden bajt długo :) –

Powiązane problemy