Viết vào một tập tin mà không chuyển hướng?


12

Tôi đang viết một ứng dụng được biên dịch thường xuyên cần tạo một tệp đặc biệt và viết một cookie ma thuật vào đó. Tôi không thể viết tệp trực tiếp từ ứng dụng, mô hình bảo mật hệ thống yêu cầu tôi khởi chạy một công cụ trợ giúp với các đặc quyền nâng cao để thực hiện thủ thuật. Tôi có thể cung cấp bất kỳ số lượng đối số cho công cụ trợ giúp. Bây giờ tôi muốn chọn một số lệnh hệ thống rất đơn giản sẽ đóng vai trò là công cụ trợ giúp và tạo tệp cho tôi. Một cái gì đó như thế này:

/bin/sh -c "/bin/echo -n 'magic' > /some/where/file"

Simple touchkhông cắt nó vì tôi cần ghi cookie vào tệp, đơn giản echokhông có trình bao bọc shell không hoạt động vì nó cần chuyển hướng để ghi tệp. Tôi không cảm thấy thoải mái khi gọi shell với quyền root để thực hiện một nhiệm vụ tầm thường như vậy. Có một số lệnh hệ thống thực sự đơn giản, bị ràng buộc mà tôi có thể gọi để viết tệp cho tôi không?


Có một lý do tại sao /bin/sh -c 'echo magic > /path/to/magic/file'không làm việc? Đó sẽ là một tập tin thực thi và hai đối số. Bạn sẽ cần xây dựng đối số cuối cùng dưới dạng một chuỗi (với sprintf hoặc tương đương). Có lý do này sẽ không làm việc cho bạn? Từ câu hỏi của bạn, có vẻ như doCommandAsRoot () không nhận đầu vào để truyền phát lệnh, đúng không? Nếu không, bạn có thể thay thế đối số cuối cùng bằng 'cat > /path/to/magic/file'và truyền dữ liệu thay vì xây dựng một chuỗi.
Arcege

Ví dụ shell hoạt động, nhưng tôi không thích gọi shell với quyền root chỉ để tạo một tệp đơn giản. Thư viện thực hiện một đối số ống giao tiếp (đó là AuthorizationExecuteWithPriv đặc quyền ), có thể được sử dụng để viết cookie bằng cách sử dụng tee. Cảm ơn!
zoul

Câu trả lời:


11

Còn cái này thì sao:

echo -n 'magic' | sudo tee /some/where/file > /dev/null

Chắc chắn có chuyển hướng trong này nhưng chỉ tee chạy như root chứ không phải shell. Làm việc với dd of=...quá.


2
Xin lỗi, tôi rõ ràng có vấn đề giải thích bản thân gần đây. Vấn đề là khi tôi muốn chạy một cái gì đó với các đặc quyền nâng cao, tôi phải trải qua một cuộc gọi thư viện đặc biệt (đại loại như doCommandAsRoot). Và hàm này chỉ chấp nhận một đường dẫn đến lệnh và các đối số của nó, vì vậy không có cách nào để tôi sử dụng chuyển hướng đầu ra ngay lập tức. Tôi có thể đi qua shell (như thể hiện trong câu hỏi), nhưng tôi không thích sự bảo mật đó.
zoul

@zoul: Tôi nghĩ bạn đang viết một kịch bản shell. Bạn có thể viết cookie ma thuật vào một tệp có thể truy cập được đối với các quy trình không có đặc quyền không? Nếu có thì viết nó vào một tập tin như vậy và gọi doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file").
stribika

Không, đó là một ứng dụng được biên dịch thường xuyên (cập nhật câu hỏi). Tôi chỉ tìm kiếm các lệnh của shell shell để làm người trợ giúp để tôi không phải tự viết nó. Vâng, cookie không có gì nhạy cảm. Các ddví dụ là khá gần với những gì tôi muốn, cảm ơn bạn. Bạn có thể nghĩ về một cái gì đó thậm chí đơn giản hơn?
zoul

Chắc chắn - bạn có thể sử dụng cphoặc mvthay vì dd.
mattdm

Ý tôi là đơn giản hơn mà không cần phải sao chép :)
zoul

9

Không có chuyển hướng đầu ra, không có đường ống, nhưng với "chuỗi ở đây":

dd of=/some/where/file <<<'magic'

Một nhược điểm của phương pháp này là dd viết một số thống kê cho thiết bị xuất chuẩn. Bạn có thể sử dụng> / dev / null để ẩn chúng, nhưng tại thời điểm đó bạn cũng có thể sử dụng tee.
studgeek

1
Điều này làm việc cho tôi trong một tình huống bất thường khi tôi không thể sử dụng chuyển hướng đầu ra hoặc đường ống. status=nonesẽ loại bỏ tất cả các đầu ra khác từ các phiên bản hiện đại của lõi core GNU dd.
Michael Hampton

5

Có một sự cân nhắc khác, đó là bạn không muốn đặt giá trị của cookie ma thuật vào một dòng lệnh, vì điều đó có thể được quan sát bởi những người dùng khác. Ngay cả khi chương trình tồn tại trong thời gian ngắn (bao gồm cả nếu chương trình không có chuỗi dòng lệnh), vẫn có cơ hội để tấn công. Vì vậy, một lý thuyết:

writestringtofile 'magic' /some/where/file

là một cách tiếp cận nguy hiểm. Do đó, tôi tán thành đề xuất của @ stribika: ghi giá trị vào một tệp tạm thời và sao chép nó vào vị trí. Đảm bảo sử dụng hàm bảo mật để tạo tệp tạm thời ( mkstemp()) để không có điều kiện chạy đua ở đó.


Cảm ơn bạn, đây là một cuộc thảo luận hữu ích. May mắn thay, cookie ma thuật của người Viking không phải là một thiết bị bảo mật, nó có thể được nhìn thấy rõ ràng bởi bất kỳ ai.
zoul
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.