Làm cách nào để trích xuất an toàn một tệp tar không tin cậy?


30

Tôi muốn có thể trích xuất một tệp tar, sao cho tất cả các tệp được trích xuất được đặt trong một thư mục tiền tố nhất định. Bất kỳ nỗ lực nào của các tệp tar để ghi vào các thư mục bên ngoài sẽ khiến việc trích xuất không thành công.

Như bạn có thể tưởng tượng, điều này là để tôi có thể trích xuất một cách an toàn một tệp tar không tin cậy.

Làm thế nào tôi có thể làm điều này với GNU tar?

Tôi đến với:

tar --exclude='/*' --exclude='*/../*' --exclude='../*' -xvf untrusted_file.tar

nhưng tôi không chắc rằng điều này đủ hoang tưởng.


2
Nó không đủ hoang tưởng. Tôi đã tạo ra một số tarball khó chịu trong quá khứ đã tăng lên thông qua các liên kết tượng trưng mà nó tạo ra. Cuối cùng tôi đã tạo ra tar của riêng mình là setuid-root để nó có thể thực thi chroot (".") Và bỏ các đặc quyền.
Joshua

8
@Joshua vậy giải pháp của bạn để làm cho một tiện ích được thử nghiệm rộng rãi an toàn hơn là tạo phiên bản của riêng bạn và cung cấp cho nó quyền root?
Ngừng làm hại Monica

4
@OrangeDog: int main (int argc, char ** argv) {chroot (".") || lối ra (1); setuid (getuid ()); rất dễ kiểm toán.
Joshua

2
Bạn cũng có thể muốn kiểm tra những gì bên trong tệp tar bằng cách sử dụng -ttùy chọn.
Thomas

Câu trả lời:


40

Bạn không cần hoang tưởng chút nào. GNU tar- và trên thực tế, bất kỳtar chương trình được viết tốt nào được tạo ra trong 30 năm qua hoặc lâu hơn - sẽ từ chối trích xuất các tệp trong tarball bắt đầu bằng dấu gạch chéo hoặc có chứa ..các phần tử, theo mặc định.

Bạn phải tìm mọi cách để buộc các tarchương trình hiện đại trích xuất các tarball độc hại như vậy: cả GNU và BSD đều tarcần -Ptùy chọn để làm cho chúng vô hiệu hóa bảo vệ này. Xem phần Tên tệp tuyệt đối trong hướng dẫn sử dụng GNU.

Tuy nhiên, -Pcờ không được chỉ định bởi POSIX, vì vậy các tarchương trình khác có thể có các cách khác nhau để đối phó với điều này. Ví dụ: starchương trình của Schily Tools sử dụng -/-..vô hiệu hóa các biện pháp bảo vệ này.

Điều duy nhất bạn có thể xem xét thêm vào một tarlệnh ngây thơ là một -Clá cờ để buộc nó trích xuất mọi thứ trong một thư mục tạm thời an toàn, vì vậy bạn không cần phải đến cdđó trước.


Ngoài ra :

  1. Về mặt kỹ thuật, tarkhông được chỉ định bởi POSIX nữa. Họ đã cố gắng nói với thế giới điện toán Unix rằng chúng ta nên sử dụng paxngay bây giờ thay vì tarcpio, nhưng thế giới điện toán chủ yếu bỏ qua chúng.

    Ở đây có liên quan để lưu ý rằng đặc tả POSIX paxkhông cho biết cách xử lý các dấu gạch chéo hoặc ..phần tử nhúng hàng đầu . Có một --insecurecờ không chuẩn cho BSDpax để ngăn chặn các biện pháp bảo vệ chống lại các ..phần tử đường dẫn được nhúng , nhưng rõ ràng không có sự bảo vệ mặc định nào đối với các dấu gạch chéo hàng đầu; paxtrang người đàn ông BSD gián tiếp khuyến nghị viết -scác quy tắc thay thế để đối phó với rủi ro đường dẫn tuyệt đối.

    Đó là loại điều xảy ra khi một tiêu chuẩn thực tế vẫn được sử dụng tích cực trong khi tiêu chuẩn de jure phần lớn bị bỏ qua.


7
pax - portable archive interchangeAwww, thật dễ thương, POSIX nghĩ rằng nó sẽ thay thế định dạng lưu trữ được sử dụng rộng rãi nhất: P
cat

1
@cat Định dạng lưu trữ mặc định là một biến thể tar được hỗ trợ rộng rãi hợp lý (AIUI cũng được cho là hỗ trợ định dạng cpio). Pax đúng hơn là một nỗ lực để thay thế giao diện lệnh để xử lý các tài liệu lưu trữ như vậy, vì việc xử lý đối số lệnh của tar là ... kỳ quặc.
Random832

Lưu ý bên ngẫu nhiên: Tôi khá chắc chắn đó là "de jour", tức là từ tiếng Pháp, trái ngược với "de jure".
Vụ kiện của Quỹ Monica

7
@QPaysTaxes thì không. de jure là tiếng Latin và tương phản với tình hình hiện tại, tức là thực tế là gì. De jour cũng nên du jour để tuân theo các quy tắc ngữ pháp tiếng Pháp.
Thủ tướng

1
Đây là một trường hợp của một nhận thức sai lầm đáng tiếc. Tiếng Pháp "du jour" ("của ngày") trông / nghe rất giống tiếng Latin "de jure" ("của luật") ở đây trái ngược với "de facto" ("thực tế"). Người ta có thể lập luận rằng pax là "tiêu chuẩn của tháng" hay "tiêu chuẩn du lịch" để tạo niềm vui về cách các tiêu chuẩn mới được đề xuất thường xuyên, trong khi cơ thể người dùng rộng lớn chỉ đơn giản là phù hợp với những gì phù hợp với họ (tiêu chuẩn thực tế), biết rằng (ẩn dụ) sẽ có một tiêu chuẩn mới vào ngày mai để họ bỏ qua.
Monty Harder

19

Với GNU tar, nó đơn giản

tar -xvf untrusted_file.tar

trong một thư mục trống. GNU tar tự động loại bỏ một /tên thành viên hàng đầu khi giải nén, trừ khi rõ ràng không được nói khác với --absolute-namestùy chọn . GNU tar cũng phát hiện khi sử dụng ../sẽ khiến một tệp được trích xuất bên ngoài thư mục toplevel và đặt các tệp đó vào thư mục toplevel, ví dụ, một thành phần foo/../../bar/quxsẽ được trích xuất như bar/quxtrong thư mục toplevel chứ không phải bar/quxtrong thư mục cha của toplevel . GNU tar cũng chăm sóc các liên kết tượng trưng chỉ ra bên ngoài thư mục toplevel, ví dụ foo -> ../..foo/barsẽ không barđược trích xuất bên ngoài thư mục toplevel.

Lưu ý rằng điều này chỉ áp dụng cho (các phiên bản gần đây của) GNU tar (cũng như một số triển khai khác, ví dụ: * BSD tar và BusyBox tar). Một số thực hiện khác không có sự bảo vệ như vậy.

Do các liên kết tượng trưng, ​​các biện pháp bảo vệ bạn sử dụng sẽ không đủ: kho lưu trữ có thể chứa một liên kết tượng trưng chỉ đến một thư mục bên ngoài cây và trích xuất các tệp trong thư mục đó. Không có cách nào để giải quyết vấn đề đó hoàn toàn dựa trên tên thành viên, bạn cần kiểm tra mục tiêu của các liên kết tượng trưng.

Lưu ý rằng nếu bạn trích xuất vào một thư mục đã chứa các liên kết tượng trưng, ​​bảo đảm có thể không còn được giữ.


6

Để bao quát một vài điểm, các câu trả lời khác không có:

  1. Trước tiên, hãy xem những gì trong tệp trước khi bạn giải nén nó:

    tar -tvf untrusted_tar_file.tar
    

    Nếu có bất cứ điều gì trong đó bạn không tin tưởng hoặc muốn giải nén, đừng trích xuất tarball.

  2. Thứ hai, trích xuất tarball với tư cách là người dùng không root mà chỉ có quyền truy cập ghi vào một thư mục mà bạn trích xuất tarball vào. Ví dụ: trích xuất tarball từ trong thư mục chính của người dùng không phải root.

4
1. Điều đó không thực tế cho các hoạt động hàng loạt. 2. Trừ khi bạn đang chạy một thiết lập tùy chỉnh, một số vị trí nhất định có thể được ghi bởi tất cả người dùng, đáng chú ý là / tmp /
pipe

@pipe người ta cũng có thể tạo một thư mục và một người dùng mới và chỉ người dùng đó mới có quyền truy cập vào thư mục đó, sau đó chạy lệnh. Tôi khá thích thư mục nhà của tôi, cảm ơn bạn.
mèo

2
@pipe Tại sao trên tốt Thiên Chúa của trái đất bạn sẽ BAO GIỜ vượt qua không tin cậy dữ liệu thông qua một hoạt động hàng loạt? Nếu bạn không tin tưởng nó, bạn sẽ không chạy nó.
Andrew Henle

6
@AndrewHenle Uhm, ok. Bạn nghĩ mọi máy chủ trên internet hoạt động như thế nào? Bạn có nghĩ rằng một số người tại stackexchange chạy bình luận này thông qua cơ sở dữ liệu và hệ thống đánh dấu của họ trong khi theo dõi thủ công hoạt động? Bởi vì đầu vào này là dữ liệu không đáng tin cậy thông qua một hoạt động hàng loạt.
ống

Tôi không khuyên bạn nên trích xuất một tập tin không đáng tin cậy trực tiếp trong một thư mục nhà. Bạn không muốn nó ghi đè lên .bashrc và các tệp .config / tệp khác, phải không?
Hrif31
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.