การรักษาความปลอดภัยการสื่อสารระหว่างระบบฝังตัวที่ จำกัด
ขณะนี้ฉันกำลังพยายามทำให้การสื่อสารผ่านช่องทางการสื่อสารทางกายภาพที่ จำกัด บนระบบฝังตัว
สถานการณ์
ฉันคิดว่าระบบค่อนข้างปกติสำหรับแอปพลิเคชันฝังตัวขนาดเล็ก:
ระบบฝังตัวที่เกี่ยวข้องเป็นไมโครคอนโทรลเลอร์ขนาดเล็กที่ไม่มีระบบปฏิบัติการใด ๆ ซึ่งสามารถสันนิษฐานได้ว่าอยู่ในสภาพแวดล้อมทางกายภาพที่ปลอดภัย ช่องทางการเชื่อมต่อสามารถเข้าถึงได้ทางกายภาพสำหรับผู้รุกรานพวกเขาสามารถแทรกแซงข้อความได้ตามต้องการ
ช่องทางการสื่อสารที่แตกต่างกันเป็นไปได้เช่น RS485 หรือ RS232 มีโปรโตคอลที่หยาบซึ่งจัดการกับสิ่งต่างๆเช่นการกำหนดแอดเดรสและความสมบูรณ์แบบหยาบ (เช่น CRC16 สำหรับ bitflips) ที่เราสามารถสร้างได้ คิดว่าเป็น TCP ที่ช้า
พันธมิตรการสื่อสารแต่ละรายรู้จักใบรับรองหลักซึ่งสามารถทำหน้าที่เป็น CA และมีใบรับรองเฉพาะ (+ คีย์) ที่ลงนามโดยใบรับรอง ใบรับรองได้รับการลงนามด้วยตนเองโค้งวงรี prime256v1
ไลบรารี mbedTLS พร้อมใช้งานสำหรับระบบเหล่านี้ (พร้อม DH, AES, .. )
เวลาส่วนใหญ่ไม่มีอินเทอร์เน็ต
ระบบสามารถรักษาเวลาและสร้างตัวเลขสุ่มได้เพียงพอ
ฉันต้องการเข้าถึงความเป็นส่วนตัวความถูกต้องและความซื่อสัตย์
อาจจะแก้ไขได้อย่างไร
กฎในโปรโตคอลการเข้ารหัสคือห้ามนำไปใช้ด้วยตัวคุณเอง ขออภัยฉันไม่พบสิ่งที่ตรงกับกรณีการใช้งานนี้
ฉันยังเรียกดูคำถามที่มีอยู่ แต่ไม่มีอะไรให้คำตอบที่สมบูรณ์ที่ฉันกำลังค้นหา
สุดท้ายในคำตอบนี้การใช้โปรโตคอลของตัวเองจะได้รับเป็นตัวเลือกสุดท้าย
นี่คือเหตุผลที่ฉันคิดวิธีแก้ปัญหาที่อธิบายไว้ด้านล่าง - แต่ฉันไม่แน่ใจทั้งหมดเกี่ยวกับเรื่องนี้ ผมมุ่งเน้นในคำตอบนี้เกี่ยวกับวิธีการรับรองความถูกต้อง Diffie-Hellmann แลกเปลี่ยนคีย์ , คำตอบนี้เกี่ยวกับวิธีการตรวจสอบความสมบูรณ์และหัวข้อนี้ให้ฉันคิดบางอย่างเกี่ยวกับวิธีการใช้เช่นโปรโตคอล
โปรโตคอลเพื่อความปลอดภัยในการสื่อสาร
สิ่งแรกที่ต้องทำคือสุ่มสร้างคีย์สมมาตร K สิ่งแรกที่ส่งคือข้อความจับมือ มีฟิลด์ดังต่อไปนี้:
ฟิลด์ | คำอธิบาย |
---|---|
DH | การแลกเปลี่ยนคีย์ Diffie-Hellmann msg g K |
ใบรับรอง | ใบรับรอง (-chain) ของอุปกรณ์ที่ส่ง |
MsgIdNonce | ค่า 64 บิตแบบสุ่ม |
ลายเซ็น | ลายเซ็นของข้อความที่สมบูรณ์โดยใช้คีย์ส่วนตัวของ Cert |
อุปกรณ์ทั้งสองส่ง (และรับ) ข้อความดังกล่าว
เมื่อได้รับข้อความดังต่อไปนี้:
- ตรวจสอบว่าใบรับรองลงนามโดย CA ที่คาดไว้หรือไม่ (ต้องอยู่ในสายโซ่)
- ตรวจสอบว่าข้อความลงนามอย่างถูกต้องด้วยใบรับรองและรหัส
เมื่อการตรวจสอบเหล่านี้ประสบความสำเร็จข้อความ DH g K ที่ส่งและรับจะถูกใช้เพื่อคำนวณคีย์สมมาตร
จากจุดนี้แอปพลิเคชันสามารถส่งข้อความที่เข้ารหัสด้วย AES-CBC เนื่องจากข้อความอาจสูญหายได้บ่อยครั้ง IV จึงอยู่ในข้อความเสมอ
นี่คือรูปแบบข้อความ:
ฟิลด์ | คำอธิบาย | เข้ารหัส |
---|---|---|
IV | Initialy Random IV สำหรับ AES | ไม่ |
MsgIdNonce | Handshake / Last MsgIdNonce + 1 หรือ + 2 | ใช่ |
ข้อมูลแอปพลิเคชัน | ข้อมูล / คำสั่งในการป้องกัน | ใช่ |
CMAC ถูกตัดให้เหลือ 64 บิต | MAC สำหรับตรวจสอบความสมบูรณ์ | ใช่ |
สำหรับข้อความที่จะได้รับการยอมรับจะต้อง
- มี MsgIdNonce ที่คาดไว้ (1 หรือ 2 ข้างต้นได้รับครั้งล่าสุด) - ป้องกันการโจมตีซ้ำทำให้สูญเสีย 1 ข้อความ
- มี CMAC ที่ถูกต้อง - ป้องกันการโจมตีความสมบูรณ์
- รับสูงสุด T วินาทีหลังจากข้อความสุดท้าย - ป้องกันการโจมตีล่าช้า
หากสิ่งใดไม่เป็นไปตามคาด Handshake จะถูกส่งอีกครั้งจากนั้นข้อความจะถูกส่งอีกครั้งพร้อมกับพารามิเตอร์ที่เปลี่ยนใหม่
คำถาม
ฉันมาถูกทางหรือควรลองอะไรที่แตกต่างไปจากเดิมอย่างสิ้นเชิง?
นี่เป็นเป้าหมายด้านความปลอดภัยของฉันหรือฉันพลาดช่องโหว่ที่ชัดเจนที่นี่หรือไม่
ได้ผลหรือไม่
ฉันหวังว่าคุณจะช่วยฉันและวิศวกรฝังตัวคนอื่น ๆ ที่ประสบปัญหาคล้าย ๆ กันได้!
คำตอบ
กฎในโปรโตคอลการเข้ารหัสคือห้ามนำไปใช้ด้วยตัวคุณเอง ขออภัยฉันไม่พบสิ่งที่ตรงกับกรณีการใช้งานนี้
คุณพิจารณาDTLS แล้วหรือยัง? นั่นพยายามที่จะแก้ไขปัญหาเดียวกัน (ยกเว้นการประทับเวลาซึ่งสามารถเพิ่มได้โดยการใส่การประทับเวลาในดาต้าแกรม) และมีสิ่งที่คิดไว้แล้ว ความเป็นไปได้อีกอย่างคือ IPsec; อย่างไรก็ตาม DTLS ดูใกล้เคียงกับการแก้ไขปัญหาที่คุณมีมากขึ้น (เว้นแต่การรับส่งข้อมูลที่คุณกำลังปกป้องคือการรับส่งข้อมูล IP)
ที่กล่าวว่านี่คือความคิดบางส่วนเกี่ยวกับโปรโตคอลที่คุณระบุไว้:
จะเกิดอะไรขึ้นถ้าข้อความตามลำดับสองข้อความหลุด (เช่นได้รับไม่ถูกต้อง)? ทั้งสองฝ่ายจะตระหนักถึงสิ่งที่เกิดขึ้นหรือไม่หรือจะดำเนินการต่อเพื่อทิ้งข้อความที่ตามมาทั้งหมด (เนื่องจากกฎ 'nonce ต้องเพิ่มขึ้นไม่เกิน 2')
สันนิษฐานว่าพวกเขาพยายาม rekey มันประสานงานกันอย่างไร? หากฝ่ายหนึ่งคิดว่ายังไม่ได้ป้อนคีย์ใหม่และอีกฝ่ายคิดว่าเป็นเช่นนั้นจะเกิดอะไรขึ้นกับข้อความที่เข้ารหัสด้วยคีย์เก่า โดยทั่วไปเราพบว่ามีประโยชน์โดยทั่วไปที่จะใส่ 'ซึ่งคีย์นี้ถูกเข้ารหัสไว้ใต้แท็ก' ด้วยการเข้ารหัส (ใน DTLS นี่คือ 'epoch')
ช่องทางการสื่อสารของคุณสามารถเรียงลำดับข้อความใหม่ได้หรือไม่? ฉันสงสัยว่าในกรณีของคุณไม่สามารถทำได้ แต่ถ้าทำได้คุณควรคิดว่าควรจัดการอย่างไร
จะเกิดอะไรขึ้นหากมีคนส่งข้อความจับมือก่อนหน้า (ที่ถูกต้อง) สิ่งนั้นจะทำให้สับสนได้อย่างไร?
ในเส้นทางการเข้ารหัสข้อมูลคุณใช้การเข้ารหัส CBC และความสมบูรณ์ของ CMAC แม้ว่านี่จะเป็นวิธีแก้ปัญหาที่ใช้งานได้ แต่ก็มีแนวโน้มที่จะเกิดการโจมตีจากช่องว่างภายในต่างๆหากไม่ได้รวมเข้าด้วยกันอย่างถูกต้อง แฟชั่นปัจจุบันคือการใช้โหมด AEAD (เช่น GCM หรือ Chacha20 / Poly1305) ซึ่งทำได้ทั้งสองอย่าง
ทราฟฟิกที่เข้ารหัสเป็นแบบทิศทางเดียวหรือแบบสองทิศทาง? หากการจราจรไปทั้งสองทางคุณใช้คีย์ชุดเดียวกันเพื่อป้องกันการรับส่งข้อมูลทั้งสองชุดหรือไม่
"หากสิ่งใดไม่เป็นไปตามคาด Handshake จะถูกส่งอีกครั้งจากนั้นข้อความจะถูกส่งอีกครั้งพร้อมกับพารามิเตอร์ที่เปลี่ยนใหม่" - มันทำงานอย่างไร? หากผู้รับตัดสินใจว่าไม่ชอบข้อความผู้ส่งจะรู้ได้อย่างไรว่าจะส่งข้อความนั้นอีกครั้ง