Ma tak duży wpływ z powodu znanej od dawna słabości interfejsu API Win32.
Programy są odradzane w Win32 za pośrednictwem CreateProcess()
wywołania systemowego. Można go używać na kilka sposobów. Ludzie pochodzący z środowisk Unix, Linux lub OS / 2 zwykle będą myśleć o tym jako o przyjmowaniu dwóch osobnych argumentów dla spawnowania programu (pliku obrazu) i przekazywania komendy do nowego procesu, ponieważ nazwy plików i wektory argumentów / ogony poleceń to dwie osobne rzeczy w interfejsach API tych systemów operacyjnych. Ale w rzeczywistości wywołanie systemowe może być wywoływane w alternatywnej formie z nazwą programu i argumentami połączonymi w jeden duży ciąg. CreateProcess()
spróbuje oddzielić nazwę pliku programu od komendy tail.
Problem polega na tym, że robi to poprzez stopniowe dzielenie łańcucha na dwoje przy każdym kolejnym znaku spacji, aż lewa część pasuje do pliku lub katalogu. Wiele programów Win32 będzie próbowało przekazać ciągi, takie jak C:\Program Files\Contoso\TakeOver.exe StackExchange.com
wywołanie systemowe. Spowoduje to uruchomienie odpowiedniego programu - C:\Program Files\Contoso\TakeOver.exe
z odpowiednim ogonem polecenia StackExchange.com
- do momentu, gdy pojawi się jakaś oczywiście niebezpieczna osoba i utworzy C:\Program
plik tak jak ty.
W tym momencie wywołanie systemowe kończy się próbą uruchomienia pliku obrazu programu C:\Program
z poleceniem tail Files\Contoso\TakeOver.exe StackExchange.com
. Niebo pomoże ci, jeśli C:\Program
w rzeczywistości jest obrazem wykonywalnego programu.
Jest to ogólna słabość i dotyczy każdej nazwy pliku programu zawierającej spacje w połączeniu z dowolnym programem używającym One Big String do odradzania innych programów. Ale najczęstszym przypadkiem, który jest dotknięty tą sytuacją , są wszystkie programy, które działają pod nimi C:\Program Files\
i duża liczba programów Win32, które wykorzystują podejście One Big String.
Jest o wiele za późno, aby zmienić Win32 API. Dziesięć lat temu było za późno. Microsoft nie może zmienić wszystkich programów napisanych przez inne osoby, które przekazują jeden duży ciąg zamiast dwóch do CreateProcess()
. Tak więc Microsoft sprawdza system Windows podczas logowania użytkownika, czy istnieje C:\Program
i wyświetla ostrzeżenie, które widzisz.
Jak widać, w dokumentacji doco Microsoftu Microsoftu znajduje się duże ostrzeżenie „Bezpieczeństwo” informujące deweloperów, aby nie pisali programów przy użyciu metody One Big String, która istnieje już od kilku lat.
Dalsza lektura