เขียนไปยังไฟล์ที่ไม่มีการเปลี่ยนเส้นทางหรือไม่?


13

ฉันกำลังเขียนแอปพลิเคชันที่คอมไพล์ปกติที่ต้องการสร้างไฟล์พิเศษและเขียนคุกกี้วิเศษลงไป ฉันไม่สามารถเขียนไฟล์ได้โดยตรงจากแอปพลิเคชันโมเดลความปลอดภัยของระบบต้องการให้ฉันเปิดใช้เครื่องมือตัวช่วยที่มีสิทธิ์ระดับสูงในการทำเคล็ดลับ ฉันสามารถให้ข้อโต้แย้งกับเครื่องมือช่วยเหลือได้ไม่ จำกัด จำนวน ตอนนี้ฉันต้องการเลือกคำสั่งระบบที่ง่ายมากซึ่งจะทำหน้าที่เป็นเครื่องมือช่วยเหลือและสร้างไฟล์ให้ฉัน บางสิ่งเช่นนี้

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

Simple touchไม่ตัดตามที่ฉันต้องการเขียนคุกกี้ลงในไฟล์ง่ายๆechoโดยไม่มี shell wrapper ไม่ทำงานเนื่องจากต้องการการเปลี่ยนเส้นทางเพื่อเขียนไฟล์ ฉันรู้สึกไม่สบายใจที่จะเรียกเชลล์ด้วยสิทธิพิเศษรูทเพื่อทำงานที่ไม่สำคัญ มีคำสั่งระบบที่เรียบง่ายและ จำกัด มาก ๆ ที่ฉันสามารถเรียกให้เขียนไฟล์ให้ฉันได้ไหม?


มีเหตุผลทำไม/bin/sh -c 'echo magic > /path/to/magic/file'ไม่ทำงาน? นั่นจะเป็นไฟล์เรียกทำงานและอาร์กิวเมนต์สองตัว คุณจะต้องสร้างอาร์กิวเมนต์สุดท้ายเป็นสตริง (ที่มี sprintf หรือเทียบเท่า) มีเหตุผลนี้จะไม่ทำงานสำหรับคุณ? จากคำถามของคุณดูเหมือนว่า doCommandAsRoot () ไม่ได้ป้อนข้อมูลเพื่อสตรีมไปยังคำสั่งถูกต้องหรือไม่ มิฉะนั้นคุณสามารถแทนที่อาร์กิวเมนต์สุดท้ายด้วย'cat > /path/to/magic/file'และส่งผ่านข้อมูลแทนการสร้างสตริง
Arcege

ตัวอย่างเชลล์ใช้งานได้ แต่ฉันไม่อยากเรียกเชลล์ด้วยสิทธิ์พิเศษรูทเพื่อสร้างไฟล์อย่างง่าย ห้องสมุดจะใช้อาร์กิวเมนต์ท่อสื่อสาร (มันAuthorizationExecuteWithPrivileges ) teeที่สามารถนำมาใช้ในการเขียนคุกกี้ใช้ ขอบคุณ!
zoul

คำตอบ:


11

เกี่ยวกับสิ่งนี้:

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

แน่ใจว่ามีการเปลี่ยนเส้นทางในการดำเนินการนี้ แต่ใช้ทีเพื่อเรียกใช้เนื่องจากรูทไม่ใช่เชลล์ ทำงานร่วมกับdd of=...เกินไป


2
ขออภัยฉันมีปัญหาในการอธิบายตัวเองเมื่อเร็ว ๆ นี้ ปัญหาคือเมื่อฉันต้องการเรียกใช้บางสิ่งด้วยสิทธิ์ระดับสูงฉันต้องผ่านการเรียกdoCommandAsRootไลบรารี่พิเศษ (เช่น) และฟังก์ชั่นนี้ยอมรับพา ธ ไปยังคำสั่งและอาร์กิวเมนต์ของมันเท่านั้นดังนั้นจึงไม่มีทางที่ฉันจะใช้การเปลี่ยนเส้นทางเอาต์พุตได้ทันที ฉันสามารถผ่านเชลล์ (ดังที่แสดงในคำถาม) แต่ฉันไม่ชอบความปลอดภัยที่ฉลาด
zoul

@ โซล: ฉันคิดว่าคุณกำลังเขียนเชลล์สคริปต์ ตกลงเพื่อเขียน magic cookie ไปยังไฟล์ที่สามารถเข้าถึงได้สำหรับกระบวนการที่ไม่มีสิทธิพิเศษหรือไม่? doCommandAsRoot("dd", "if=/tmp/unprotected_file", "of=/some/where/file")ถ้ามันถูกแล้วเขียนไปยังแฟ้มดังกล่าวและเรียกร้อง
stribika

ไม่มันเป็นแอปพลิเคชันที่รวบรวมเป็นประจำ (อัปเดตคำถาม) ฉันแค่มองหาคำสั่ง "เชลล์" เพื่อทำหน้าที่เป็นผู้ช่วยเพื่อที่ฉันจะได้ไม่ต้องเขียนเอง ใช่คุกกี้ไม่มีความอ่อนไหว ddตัวอย่างคือสวยใกล้เคียงกับสิ่งที่ฉันต้องการขอบคุณ คุณลองนึกถึงบางสิ่งที่ง่ายกว่านี้อีกไหม
zoul

แน่นอนว่า - คุณสามารถใช้cpหรือแทนmv dd
mattdm

ผมหมายถึงเป็นที่เรียบง่ายโดยไม่จำเป็นต้องคัดลอก :)
zoul

9

โดยไม่ต้องเปลี่ยนเส้นทางเอาท์พุทโดยไม่ต้องไพพ์ แต่ด้วย "here string":

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

ข้อเสียของวิธีการนี้คือ dd เขียนสถิติบางอย่างเพื่อ stdout คุณสามารถใช้> / dev / null เพื่อซ่อนพวกเขา แต่ ณ จุดนั้นคุณอาจใช้ tee
studgeek

1
สิ่งนี้ใช้ได้กับฉันในสถานการณ์ที่ผิดปกติซึ่งฉันไม่สามารถใช้การเปลี่ยนเส้นทางขาออกหรือท่อได้ status=noneจะระงับการส่งออกอื่น ๆ ทั้งหมดจากรุ่นที่ทันสมัยของ ddcoreutils
Michael Hampton

5

มีข้อควรพิจารณาอีกประการหนึ่งคือคุณไม่ต้องการใส่ค่าของคุกกี้มายากลลงในบรรทัดคำสั่งเนื่องจากผู้ใช้รายอื่นสามารถสังเกตได้ แม้ว่าโปรแกรมจะมีอายุสั้น (รวมถึงหากโปรแกรมเป็นศูนย์ออกจากสตริงบรรทัดคำสั่ง) ก็มีโอกาสที่จะถูกโจมตีได้ ดังนั้นทฤษฎี:

writestringtofile 'magic' /some/where/file

เป็นวิธีที่อันตราย ดังนั้นฉันรับรองข้อเสนอแนะของ @ stribika: เขียนค่าลงในไฟล์ชั่วคราวและคัดลอกเข้าที่ ตรวจสอบให้แน่ใจว่าได้ใช้ฟังก์ชั่นที่ปลอดภัยเพื่อสร้างไฟล์ชั่วคราว ( mkstemp()) เพื่อให้ไม่มีสภาพการแข่งขันที่นั่น


ขอบคุณนี่คือการสนทนาที่มีประโยชน์ โชคดีที่ "คุกกี้วิเศษ" ไม่ใช่อุปกรณ์รักษาความปลอดภัย แต่ทุกคนสามารถมองเห็นได้อย่างชัดเจน
zoul

0

ฟองน้ำจาก moreutils - ดูดซับอินพุตมาตรฐานและเขียนลงไฟล์:

echo -n 'magic' | sponge /some/where/file

แตกต่างจากการเปลี่ยนเส้นทางเปลือกฟองน้ำดูดซับอินพุตทั้งหมดก่อนที่จะเขียนไฟล์เอาต์พุต เมื่อเป็นไปได้ฟองน้ำจะสร้างหรืออัปเดตไฟล์เอาต์พุตโดยใช้อะตอมมิกโดยการเปลี่ยนชื่อไฟล์ temp ให้เข้าที่

ดูเพิ่มเติม

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.