Tại sao một chương trình có tên là C C: \ Chương trình có thể ảnh hưởng đến các chương trình khác?


15

Hôm nay, ngoài màu xanh, một tệp có tên đã Programxuất hiện trên thư mục gốc C:\và khi đăng nhập vào hệ thống, một cửa sổ bật lên hiển thị thông báo:

Tên tệp cảnh báo

Có một tệp hoặc thư mục trên máy tính của bạn có tên là "C: \ Chương trình" có thể khiến một số ứng dụng không hoạt động chính xác. Đổi tên thành "C: \ Program1" sẽ giải quyết vấn đề. Bạn có muốn đổi tên nó bây giờ?

Trong khi tin nhắn là tự giải thích, tôi tự hỏi tại sao tập tin này có thể có ảnh hưởng lớn như vậy? Thật vậy, một số chương trình (có thể là tất cả, tôi đã không kiểm tra) nằm ở nơi C:\Program Files...không bắt đầu. Tôi có thể hiểu làm thế nào tập tin như vậy có thể được tạo ra (ví dụ, cố gắng ghi vào thư mục C:\Program Files\Something...nhưng không có dấu ngoặc kép), nhưng tôi hầu như không hiểu làm thế nào nó có thể tác động đến các chương trình khác.


1
Bạn có chắc đây là một tin nhắn được tạo bởi Windows?
Ramhound

1
Yeap, được kiểm tra hai lần từ Process Mininger, đó là một hộp thoại từ explorer.exe
Konrad Kokosa

2
Âm thanh sơ sài, không có chương trình nào (bên ngoài một vài lựa chọn) nên được cài đặt ở bất cứ đâu ngoài nơi Program Files* dành cho người tiêu dùng thông thường. Nhưng tôi sẽ nghĩ rằng đó là vì kết hợp xấu cho tìm kiếm có thể tìm thấy thay vì Program Files.
nerdwaller

Câu trả lời:


26

Nó có ảnh hưởng lớn như vậy vì một điểm yếu đã được biết đến từ lâu trong API Win32.

Các chương trình được sinh ra trong Win32 thông qua CreateProcess()cuộc gọi hệ thống. Nó có thể được sử dụng theo nhiều cách. Những người đến từ nền tảng Unix, Linux hoặc OS / 2 thường sẽ nghĩ về việc lấy hai đối số riêng biệt cho chương trình (tệp hình ảnh) để sinh ra và đuôi lệnh để chuyển sang quy trình mới, vì tên tệp và vectơ đối số / đuôi lệnh là hai điều riêng biệt trong API của các hệ điều hành đó. Nhưng trên thực tế, cuộc gọi hệ thống có thể được gọi trong một hình thức thay thế với tên chương trình và các đối số được trộn với nhau trong một chuỗi lớn. CreateProcess()sẽ cố tách tên tệp chương trình khỏi đuôi lệnh.

Vấn đề là nó thực hiện điều này bằng cách chia dần chuỗi thành hai phần tại mỗi ký tự khoảng trắng liên tiếp, cho đến khi phần bên trái khớp với tệp hoặc thư mục. Nhiều chương trình Win32 sẽ cố gắng chuyển các chuỗi như C:\Program Files\Contoso\TakeOver.exe StackExchange.comcho cuộc gọi hệ thống. Điều này sẽ chạy đúng chương trình - C:\Program Files\Contoso\TakeOver.exe- với đuôi lệnh đúng - StackExchange.com- cho đến khi một người rõ ràng nguy hiểm xuất hiện và tạo một C:\Programtệp giống như bạn đã làm.

Tại thời điểm đó, cuộc gọi hệ thống kết thúc khi cố chạy tệp hình ảnh chương trình C:\Programbằng đuôi lệnh Files\Contoso\TakeOver.exe StackExchange.com. Trời giúp bạn nếu C:\Programtrên thực tế là một hình ảnh chương trình thực thi.

Đây là một điểm yếu chung và nó áp dụng cho bất kỳ tên tệp chương trình nào chứa khoảng trắng kết hợp với bất kỳ chương trình nào sử dụng One Big String để sinh ra các chương trình khác. Nhưng trường hợp phổ biến nhất bị ảnh hưởng bởi điều này là tất cả các chương trình sống C:\Program Files\và một số lượng lớn các chương trình Win32 sử dụng phương pháp Một chuỗi lớn.

Đã quá muộn để thay đổi API Win32. Nó đã quá muộn một thập kỷ trước. Và Microsoft không thể thay đổi tất cả các chương trình được viết bởi những người khác vượt qua một chuỗi lớn thay vì hai thành CreateProcess(). Vì vậy, Microsoft thực hiện kiểm tra Windows, khi đăng nhập người dùng, cho sự tồn tại C:\Programvà hiển thị cảnh báo mà bạn nhìn thấy.

Và, như bạn có thể thấy, có một cảnh báo "Bảo mật" lớn trong tài liệu Win32 của Microsoft nói với các nhà phát triển không viết chương trình bằng cách sử dụng phương pháp One Big String, đã có từ vài năm nay.

đọc thêm


6
Câu trả lời tuyệt vời! Khi tôi là nhà phát triển, điều tiếp theo tôi sẽ làm rõ ràng là tạo ra một hình nộm C:\Program.exeghi lại tất cả các tham số dòng lệnh của nó. Chúng ta sẽ xem ai sử dụng nó!
Konrad Kokosa

1
Vì vậy, đây là lý do tại sao các cài đặt bảo mật mặc định kể từ XP không cho phép tạo các tệp trong thư mục gốc bằng các quản trị viên không phải là quản trị viên.
kinokijuf
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.