Dzisiaj nieoczekiwanie Program
pojawił się plik o nazwie root C:\
, a podczas logowania do systemu wyskakujące okienko wyświetla komunikat:
Ostrzeżenie nazwy pliku
Na komputerze znajduje się plik lub folder o nazwie „C: \ Program”, który może powodować nieprawidłowe działanie niektórych aplikacji. Zmiana nazwy na „C: \ Program1” rozwiązałaby problem. Czy chcesz teraz zmienić nazwę?
Chociaż przesłanie samo się wyjaśnia, zastanawiam się, dlaczego ten plik może mieć tak duży wpływ? Rzeczywiście, niektóre programy (być może wszystkie, których nie sprawdziłem) znajdujące się w C:\Program Files...
ogóle się nie uruchamiały. Rozumiem, w jaki sposób można utworzyć taki plik (na przykład próbuję pisać do folderu, C:\Program Files\Something...
ale bez cudzysłowów), ale nie rozumiem, w jaki sposób może wpłynąć na inne programy.
źródło
Program Files*
dla typowego konsumenta. Ale sądzę, że to dlatego, że zamiast tego można znaleźć złe dopasowanie do wyszukiwaniaProgram Files
.Odpowiedzi:
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 poleceniaStackExchange.com
- do momentu, gdy pojawi się jakaś oczywiście niebezpieczna osoba i utworzyC:\Program
plik tak jak ty.W tym momencie wywołanie systemowe kończy się próbą uruchomienia pliku obrazu programu
C:\Program
z poleceniem tailFiles\Contoso\TakeOver.exe StackExchange.com
. Niebo pomoże ci, jeśliC:\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 istniejeC:\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
źródło
C:\Program.exe
który rejestruje wszystkie parametry wiersza poleceń. Zobaczymy, kto go używa!