วิธีป้องกันการคัดลอกต่อไปนี้เป็นเรื่องง่ายแค่ไหน? [ปิด]


11

ฉันพยายามคัดลอก - ปกป้องงานบางอย่างซึ่งเป็นการ์ด SD ที่สามารถบู๊ตได้ซึ่งเป็นการบูทเคอร์เนล Linux บนอุปกรณ์ ARM (Raspberry Pi) ฉันใช้วิธีนี้:

  1. วิธีใช้ initrd เพื่อเมาท์ระบบไฟล์รูทที่เข้ารหัส
  2. initrd สร้างรหัสผ่านของระบบไฟล์ตาม CID ของการ์ด SD (ใช้ฟังก์ชันแฮชไม่ได้ตัดสินใจมากกว่า md5 หรือ sha1) เริ่มต้นจะพยายามเมานต์ระบบไฟล์โดยใช้รหัสผ่านที่สร้างขึ้น
  3. ตอนนี้ที่นี่เป็นส่วนที่น่าสนใจที่สุด / ผู้ต้องสงสัย: ตัวเริ่มต้นถูกเข้ารหัสโดยใช้ฟังก์ชั่น C ที่กำหนดเองโดยทั่วไปแต่ละไบต์คือ XOR'ed โดยใช้เครื่องกำเนิดไฟฟ้าแบบหลอกเทียมแบบกำหนดเอง เคอร์เนลถูกปรับเปลี่ยนให้มีฟังก์ชั่นการเข้ารหัสเช่นเดียวกันซึ่งทำงานเป็นตัวถอดรหัส
  4. ระบบถูกถอดออกดังนั้นจึงไม่มีวิธีใช้แป้นพิมพ์หรือที่จัดเก็บข้อมูลภายนอก แอปเดียวทำงานแบบเต็มหน้าจอ

ดังนั้นหลังจาก bootloader โหลดเคอร์เนลและ initrd เคอร์เนลถอดรหัส initrd และเรียกใช้งานสคริปต์ init ซึ่งจะสร้างรหัสผ่านและติดตั้งระบบไฟล์รูท

คำถามของฉันคือ: มันจะง่ายกว่าที่จะทำลายการตั้งค่านี้ (เพื่อถอดรหัสระบบไฟล์รากและทำให้มันบูตจากการ์ด SD ใด ๆ )? ชิ้นส่วนที่อ่อนแอที่สุดคืออะไร? decompile kernel และค้นหาฟังก์ชั่นการเข้ารหัสที่กำหนดเองนั้นง่ายแค่ไหน?

แก้ไข: นี่คือการแก้ไขบางอย่างเพื่อให้คุณไม่ต้องเสียเวลากับสิ่งที่ชัดเจน:

  1. อุปกรณ์รูทจะถูกเข้ารหัสด้วย LUKS (aes256) และคีย์จะถูกสร้างขึ้นโดยฟังก์ชัน HMAC บางอย่างโดยใช้ CID ของการ์ด SD และเกลือบางส่วน
  2. อัลกอริทึมแบบหลอกหลอกสำหรับการเข้ารหัส initramfs จะเป็นจริง RC4 เพียงคีย์จะถูกสร้างขึ้นโดยใช้ฟังก์ชั่นที่กำหนดเองเพราะถ้าฉันเพียงแค่เก็บกุญแจไว้ในอาร์เรย์ไบต์มันทำให้ง่ายต่อการเรียกคืน (ใช่นี่คือความปลอดภัยผ่านความสับสน แต่ดูเหมือนไม่มีวิธีอื่น)
  3. ฉันเข้าใจว่าถ้าใช้ตัวจำลอง SD การ์ดใครบางคนสามารถทำสำเนาของระบบนี้เริ่มต้นได้ แต่มันก็โอเคกับฉันเพราะมันค่อนข้างยากและไม่มีใครสามารถทำสิ่งนี้ได้

เคอร์เนลและ initrd ถูกเก็บไว้ที่ไหน?
user1686

ทั้งหมดจะถูกเก็บไว้ในการ์ด SD เดียว ทั้งในไฟล์แยกกัน เก็บไว้ตามปกติใน / boot
dimovnike

คำตอบ:


7

มันง่ายแค่ไหนที่จะทำลายการตั้งค่านี้ (เพื่อถอดรหัสระบบไฟล์รูทและทำให้มันบูตจาก SD card ใด ๆ )

ความยากแค่ไหนในการ "หยุด" การตั้งค่าของคุณขึ้นอยู่กับจำนวนบิตของเอนโทรปีในวิธีใดก็ตามที่คุณใช้ในการลงชื่อ / เข้ารหัสระบบไฟล์นั้นเอง (เนื่องจากเป็นการกำหนดจำนวนรวมของชุดค่าผสมที่ไม่ซ้ำกัน รหัสผ่าน).

ชิ้นส่วนที่อ่อนแอที่สุดคืออะไร?

ไม่ต้องสงสัยเลยว่าการใช้ CID ที่กำหนดไว้ล่วงหน้าเป็นรหัสผ่านเช่นเดียวกับการใช้ฟังก์ชั่นการสร้างหมายเลขหลอกแบบกำหนดเอง

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

สุดท้ายใช้ชนิดของสุ่มหลอกเครื่องกำเนิดไฟฟ้าจำนวนใด ๆ แล้วมีข้อบกพร่องที่แท้จริงบางอย่างแม่นยำเพราะมันไม่สุ่ม - มีเหตุผลก็เรียกว่าสุ่มหลอก อาจเป็นการดีกว่าที่จะใช้ bootloader เข้ารหัสที่สร้างไว้ล่วงหน้า (เช่นTrueCryptหรือ LUKS ซึ่งทั้งคู่ทำงานกับ Raspberry Pi) และหลีกเลี่ยงการปรับเปลี่ยนเคอร์เนลด้วยตนเอง

decompile kernel และค้นหาฟังก์ชั่นการเข้ารหัสที่กำหนดเองนั้นง่ายแค่ไหน?

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


TL, DR : อย่าคิดค้นวงล้อใหม่เมื่อพูดถึงการเข้ารหัสและความปลอดภัยติดกับความพยายามและความจริง มีตัวเลือกการเข้ารหัสดิสก์เต็มรูปแบบหลายอย่างที่มีอยู่แล้วและแสดงให้เห็นว่าใช้งานได้ดีกับ Raspberry Pi ฉันจะหลีกเลี่ยงการใช้ CID ของการ์ด SD เป็น "รหัสผ่าน" - แม้ว่ามันจะไม่สามารถเปลี่ยนแปลงได้ แต่ก็มีวิธีที่จะหลอกค่านี้

การป้องกันการทำสำเนาถูกรวมอยู่ในข้อกำหนดการ์ด SD เป็นCPRMแล้ว


ขอบคุณสำหรับคำตอบ. ฉันรู้เกี่ยวกับ CPRM แต่รายละเอียดของมันถูกปิดด้วย NDA และค่าใช้จ่ายเงินจำนวนมาก (จากสิ่งที่ฉัน googled) สำหรับ LUKS และ Truecrypt สิ่งเหล่านี้จำเป็นต้องใช้กุญแจที่ต้องใช้ในการบู๊ตด้วยตนเอง หากฉันแก้ไข TrueCrypt bootloader เพื่อสร้างคีย์จาก CID โดยใช้ฟังก์ชั่น hmac บางอย่างจะดีกว่านี้หรือไม่? ฉันเข้าใจด้วยว่าสามารถทำได้ด้วยตัวจำลอง SD การ์ด แต่ก็ดีสำหรับฉันนี่เป็นระดับความยากลำบากของโจรสลัดที่สะดวก (ฉันเข้าใจว่าที่นี่ไม่มีการป้องกัน 100% ตราบใดที่กุญแจมีอยู่ในอุปกรณ์)
dimovnike

@ user2021201 แน่นอนว่าเป็นสิ่งที่ฉันพยายามที่จะนำคุณไปสู่ มันอาจจะค่อนข้างง่ายในการแก้ไข Truecrypt bootloader จากซอร์สแม้ว่าฉันไม่แน่ใจว่ามันยากแค่ไหนที่จะได้รับ CID จาก bootloader (เนื่องจากคุณไม่มีระบบปฏิบัติการที่โหลดเพื่อค้นหาสเปคการ์ด SD จาก ) อย่างไรก็ตามหากคุณจัดการมันอาจจะเป็นทางออกที่ยอมรับได้และเพียงพอสำหรับความต้องการของคุณ
พัฒนาที่

1

คนที่มีทักษะจะไม่มีปัญหาในการแคร็ก มันค่อนข้างง่ายในการบูตการ์ด SD ภายใต้ตัวจำลองและจากนั้นอ่านคีย์จาก RAM จากนั้นพวกเขาโพสต์เวอร์ชันที่ไม่มีการป้องกันการคัดลอกไปยัง Pirate Bay (ฯลฯ ) และนั่นก็เป็นเช่นนั้น

หรือใช้อีมูเลเตอร์เพื่อฉีด shellcode ลงในระบบที่รันอยู่ จากนั้นใช้ระบบที่รันอยู่เพื่อคัดลอกรูทถอดรหัสที่ถอดรหัส (หรืออ่านคีย์โดยใช้dmsetup table --showkeysฯลฯ )

การค้นหาอย่างรวดเร็วทำให้เกิดการมีอยู่ของอีมูเลเตอร์ Raspberry Piดังนั้นส่วนหนึ่งของงานจึงเสร็จสิ้นแล้ว

คุณมีปัญหาอื่นโดยเฉพาะอย่างยิ่งสิ่งนี้:

เคอร์เนลถูกปรับเปลี่ยนให้มีฟังก์ชั่นการเข้ารหัสเช่นเดียวกันซึ่งทำงานเป็นตัวถอดรหัส

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

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

ฉันไม่คุ้นเคยกับรหัสบูต Raspberry Pi อย่างสมบูรณ์ แต่ถ้าคุณสามารถ reflash bootloader ด้วยรหัส crypto ในตัว (ที่ส่งต่อไปยังเคอร์เนล) อย่างน้อยก็ไม่ควรอยู่ใน SD card ดังนั้น ' งฟอยล์พยายามที่จะให้มันบูตในโปรแกรมจำลอง


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