การรักษาความปลอดภัยการสื่อสารระหว่างระบบฝังตัวที่ จำกัด

Jan 04 2021

ขณะนี้ฉันกำลังพยายามทำให้การสื่อสารผ่านช่องทางการสื่อสารทางกายภาพที่ จำกัด บนระบบฝังตัว

สถานการณ์

ฉันคิดว่าระบบค่อนข้างปกติสำหรับแอปพลิเคชันฝังตัวขนาดเล็ก:

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

  • ช่องทางการสื่อสารที่แตกต่างกันเป็นไปได้เช่น RS485 หรือ RS232 มีโปรโตคอลที่หยาบซึ่งจัดการกับสิ่งต่างๆเช่นการกำหนดแอดเดรสและความสมบูรณ์แบบหยาบ (เช่น CRC16 สำหรับ bitflips) ที่เราสามารถสร้างได้ คิดว่าเป็น TCP ที่ช้า

  • พันธมิตรการสื่อสารแต่ละรายรู้จักใบรับรองหลักซึ่งสามารถทำหน้าที่เป็น CA และมีใบรับรองเฉพาะ (+ คีย์) ที่ลงนามโดยใบรับรอง ใบรับรองได้รับการลงนามด้วยตนเองโค้งวงรี prime256v1

  • ไลบรารี mbedTLS พร้อมใช้งานสำหรับระบบเหล่านี้ (พร้อม DH, AES, .. )

  • เวลาส่วนใหญ่ไม่มีอินเทอร์เน็ต

  • ระบบสามารถรักษาเวลาและสร้างตัวเลขสุ่มได้เพียงพอ

ฉันต้องการเข้าถึงความเป็นส่วนตัวความถูกต้องและความซื่อสัตย์

อาจจะแก้ไขได้อย่างไร

กฎในโปรโตคอลการเข้ารหัสคือห้ามนำไปใช้ด้วยตัวคุณเอง ขออภัยฉันไม่พบสิ่งที่ตรงกับกรณีการใช้งานนี้

ฉันยังเรียกดูคำถามที่มีอยู่ แต่ไม่มีอะไรให้คำตอบที่สมบูรณ์ที่ฉันกำลังค้นหา

สุดท้ายในคำตอบนี้การใช้โปรโตคอลของตัวเองจะได้รับเป็นตัวเลือกสุดท้าย

นี่คือเหตุผลที่ฉันคิดวิธีแก้ปัญหาที่อธิบายไว้ด้านล่าง - แต่ฉันไม่แน่ใจทั้งหมดเกี่ยวกับเรื่องนี้ ผมมุ่งเน้นในคำตอบนี้เกี่ยวกับวิธีการรับรองความถูกต้อง Diffie-Hellmann แลกเปลี่ยนคีย์ , คำตอบนี้เกี่ยวกับวิธีการตรวจสอบความสมบูรณ์และหัวข้อนี้ให้ฉันคิดบางอย่างเกี่ยวกับวิธีการใช้เช่นโปรโตคอล

โปรโตคอลเพื่อความปลอดภัยในการสื่อสาร

สิ่งแรกที่ต้องทำคือสุ่มสร้างคีย์สมมาตร K สิ่งแรกที่ส่งคือข้อความจับมือ มีฟิลด์ดังต่อไปนี้:

ฟิลด์ คำอธิบาย
DH การแลกเปลี่ยนคีย์ Diffie-Hellmann msg g K
ใบรับรอง ใบรับรอง (-chain) ของอุปกรณ์ที่ส่ง
MsgIdNonce ค่า 64 บิตแบบสุ่ม
ลายเซ็น ลายเซ็นของข้อความที่สมบูรณ์โดยใช้คีย์ส่วนตัวของ Cert

อุปกรณ์ทั้งสองส่ง (และรับ) ข้อความดังกล่าว

เมื่อได้รับข้อความดังต่อไปนี้:

  1. ตรวจสอบว่าใบรับรองลงนามโดย CA ที่คาดไว้หรือไม่ (ต้องอยู่ในสายโซ่)
  2. ตรวจสอบว่าข้อความลงนามอย่างถูกต้องด้วยใบรับรองและรหัส

เมื่อการตรวจสอบเหล่านี้ประสบความสำเร็จข้อความ DH g K ที่ส่งและรับจะถูกใช้เพื่อคำนวณคีย์สมมาตร

จากจุดนี้แอปพลิเคชันสามารถส่งข้อความที่เข้ารหัสด้วย AES-CBC เนื่องจากข้อความอาจสูญหายได้บ่อยครั้ง IV จึงอยู่ในข้อความเสมอ

นี่คือรูปแบบข้อความ:

ฟิลด์ คำอธิบาย เข้ารหัส
IV Initialy Random IV สำหรับ AES ไม่
MsgIdNonce Handshake / Last MsgIdNonce + 1 หรือ + 2 ใช่
ข้อมูลแอปพลิเคชัน ข้อมูล / คำสั่งในการป้องกัน ใช่
CMAC ถูกตัดให้เหลือ 64 บิต MAC สำหรับตรวจสอบความสมบูรณ์ ใช่

สำหรับข้อความที่จะได้รับการยอมรับจะต้อง

  1. มี MsgIdNonce ที่คาดไว้ (1 หรือ 2 ข้างต้นได้รับครั้งล่าสุด) - ป้องกันการโจมตีซ้ำทำให้สูญเสีย 1 ข้อความ
  2. มี CMAC ที่ถูกต้อง - ป้องกันการโจมตีความสมบูรณ์
  3. รับสูงสุด T วินาทีหลังจากข้อความสุดท้าย - ป้องกันการโจมตีล่าช้า

หากสิ่งใดไม่เป็นไปตามคาด Handshake จะถูกส่งอีกครั้งจากนั้นข้อความจะถูกส่งอีกครั้งพร้อมกับพารามิเตอร์ที่เปลี่ยนใหม่

คำถาม

ฉันมาถูกทางหรือควรลองอะไรที่แตกต่างไปจากเดิมอย่างสิ้นเชิง?

นี่เป็นเป้าหมายด้านความปลอดภัยของฉันหรือฉันพลาดช่องโหว่ที่ชัดเจนที่นี่หรือไม่

ได้ผลหรือไม่

ฉันหวังว่าคุณจะช่วยฉันและวิศวกรฝังตัวคนอื่น ๆ ที่ประสบปัญหาคล้าย ๆ กันได้!

คำตอบ

2 poncho Jan 04 2021 at 23:18

กฎในโปรโตคอลการเข้ารหัสคือห้ามนำไปใช้ด้วยตัวคุณเอง ขออภัยฉันไม่พบสิ่งที่ตรงกับกรณีการใช้งานนี้

คุณพิจารณาDTLS แล้วหรือยัง? นั่นพยายามที่จะแก้ไขปัญหาเดียวกัน (ยกเว้นการประทับเวลาซึ่งสามารถเพิ่มได้โดยการใส่การประทับเวลาในดาต้าแกรม) และมีสิ่งที่คิดไว้แล้ว ความเป็นไปได้อีกอย่างคือ IPsec; อย่างไรก็ตาม DTLS ดูใกล้เคียงกับการแก้ไขปัญหาที่คุณมีมากขึ้น (เว้นแต่การรับส่งข้อมูลที่คุณกำลังปกป้องคือการรับส่งข้อมูล IP)

ที่กล่าวว่านี่คือความคิดบางส่วนเกี่ยวกับโปรโตคอลที่คุณระบุไว้:

  • จะเกิดอะไรขึ้นถ้าข้อความตามลำดับสองข้อความหลุด (เช่นได้รับไม่ถูกต้อง)? ทั้งสองฝ่ายจะตระหนักถึงสิ่งที่เกิดขึ้นหรือไม่หรือจะดำเนินการต่อเพื่อทิ้งข้อความที่ตามมาทั้งหมด (เนื่องจากกฎ 'nonce ต้องเพิ่มขึ้นไม่เกิน 2')

  • สันนิษฐานว่าพวกเขาพยายาม rekey มันประสานงานกันอย่างไร? หากฝ่ายหนึ่งคิดว่ายังไม่ได้ป้อนคีย์ใหม่และอีกฝ่ายคิดว่าเป็นเช่นนั้นจะเกิดอะไรขึ้นกับข้อความที่เข้ารหัสด้วยคีย์เก่า โดยทั่วไปเราพบว่ามีประโยชน์โดยทั่วไปที่จะใส่ 'ซึ่งคีย์นี้ถูกเข้ารหัสไว้ใต้แท็ก' ด้วยการเข้ารหัส (ใน DTLS นี่คือ 'epoch')

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

  • จะเกิดอะไรขึ้นหากมีคนส่งข้อความจับมือก่อนหน้า (ที่ถูกต้อง) สิ่งนั้นจะทำให้สับสนได้อย่างไร?

  • ในเส้นทางการเข้ารหัสข้อมูลคุณใช้การเข้ารหัส CBC และความสมบูรณ์ของ CMAC แม้ว่านี่จะเป็นวิธีแก้ปัญหาที่ใช้งานได้ แต่ก็มีแนวโน้มที่จะเกิดการโจมตีจากช่องว่างภายในต่างๆหากไม่ได้รวมเข้าด้วยกันอย่างถูกต้อง แฟชั่นปัจจุบันคือการใช้โหมด AEAD (เช่น GCM หรือ Chacha20 / Poly1305) ซึ่งทำได้ทั้งสองอย่าง

  • ทราฟฟิกที่เข้ารหัสเป็นแบบทิศทางเดียวหรือแบบสองทิศทาง? หากการจราจรไปทั้งสองทางคุณใช้คีย์ชุดเดียวกันเพื่อป้องกันการรับส่งข้อมูลทั้งสองชุดหรือไม่

  • "หากสิ่งใดไม่เป็นไปตามคาด Handshake จะถูกส่งอีกครั้งจากนั้นข้อความจะถูกส่งอีกครั้งพร้อมกับพารามิเตอร์ที่เปลี่ยนใหม่" - มันทำงานอย่างไร? หากผู้รับตัดสินใจว่าไม่ชอบข้อความผู้ส่งจะรู้ได้อย่างไรว่าจะส่งข้อความนั้นอีกครั้ง