ระหว่างที่เมลลิ่งลิสต์ mozilla.dev.security.policy (MDSP) กำลังพิจารณารองรับให้บริษัท DarkMatter เข้าเป็นหน่วยงานออกใบรับรองเข้ารหัส (certification authority - CA) Corey Bonnell วิศวกรจาก Sophos พบว่าใบรับรองของ DarkMatter นั้นออกใบรับรองที่หมายเลขซีเรียลความยาวขาดไป 1 บิต จึงโต้แย้งว่าไม่ควรรับ DarkMatter เข้าเป็น CA แต่ปรากฎว่าเมื่อตรวจสอบใบ CA รายสำคัญได้แก่ แอปเปิล, กูเกิล, และ GoDaddy ก็ล้วนออกใบรับรองที่ความยาวหมายเลขซีเรียลไม่เพียงพอเช่นกัน และต้องออกใบรับรองใหม่ทั้งหมดกว่าล้านใบ
ข้อกำหนดของ CA/Browser Forum ระบุให้ใบรับรองเข้ารหัสต้องมีหมายเลขซีเรียลที่สุ่มขึ้นมา โดยกระบวนการสุ่มต้องมีความยุ่งเหยิง (entropy) ไม่ต่ำกว่า 64 บิต ทำให้ CA จำนวนหนึ่งคอนฟิกระบบให้ออกใบรับรองเข้ารหัสที่มีหมายเลขซีเรียลความยาว 64 บิตพอดี หมายเลขซีเรียลนั้นต้องเป็นจำนวนเต็มบวกตามฟอร์แมตไฟล์ X.509 ทำให้การสุ่มเลขเต็มบวก 64 บิตกลายเป็นเลขที่มีความยุ่งเหยิง 63 บิต เนื่องจากเลขบิตแรกเป็น sign bit หรือสัญลักษณ์บวกลบ
ความผิดพลาดนี้เป็นบั๊กของ EJBCA โครงการซอฟต์แวร์ CA โอเพนซอร์ส ทำให้ CA หลายรายได้รับผลกระทบร่วมกัน
CA ที่คอนฟิกให้ออกเลขซีเรียลไว้ 64 บิตพอดีได้แก่ แอปเปิล, กูเกิล, และ GoDaddy ล้วนออกใบรับรองที่หมายเลขผิดไปแล้วกว่าสองล้านใบ โดยแอปเปิลออกไปแล้ว 878,000 ใบและยังใช้งานได้อยู่ 558,000 ใบ ขณะที่กูเกิลออกไปกว่าแสนใบ แต่มีใช้งานได้อยู่เพียง 7,100 ใบเท่านั้น ส่วน GoDaddy คาดว่ามีใบรับรองที่ได้รับผลกระทบ 12,000 ใบ อย่างไรก็ดี เป็นไปได้ว่าจะมี CA อื่นๆ พบปัญหาแบบเดียวกัน
ข้อกำหนดหมายเลขซีเรียล 64 บิต เป็นข้อกำหนดที่ CA/Browser Forum เพิ่มเติมเข้ามาเมื่อปี 2016 เพื่อช่วยลดช่องโหว่ในกรณีที่กระบวนการเซ็นลายเซ็นใบรับรองยังเป็น MD5 ที่มีช่องโหว่ การใช้หมายเลขซีเรียลที่ยาวขึ้นจะช่วยเพิ่มความยากในการโจมตีได้ เนื่องจากใบรับรองสำหรับเว็บสมัยใหม่ล้วนใช้ SHA-2 กันหมดแล้วหลังจากกูเกิลไม่รองรับใบรับรอง SHA-1 เมื่อปี 2015 การโจมตีเช่นเดิมไม่น่ามีอีกต่อไป อย่างไรก็ตาม เนื่องจากใบรับรองทั้งหมดออกผิดข้อกำหนดของ CA/Browser Forum ทำให้ต้องออกใบรับรองใหม่อยู่ดี ตอนนี้กูเกิลก็เริ่มออกใบรับรองได้เกือบทั้งหมดแล้ว และส่วนที่เหลือก็จะหมดอายุภายในเดือนนี้
ที่มา - ArsTechnica
ภาพโดย typographyimages
ลืมตั้งเป็น unsigned?
whitebigbird Thu, 03/14/2019 - 07:30
ลืมตั้งเป็น unsigned?
ต้องตั้งเป็น signed bit +
McKay Thu, 03/14/2019 - 13:44
In reply to ลืมตั้งเป็น unsigned? by whitebigbird
ต้องตั้งเป็น signed bit + entropy 64bit = 65bit ครับ
นึกว่าใช้ Header
IDCET Thu, 03/14/2019 - 14:48
In reply to ต้องตั้งเป็น signed bit + by McKay
นึกว่าใช้ Header ใส่ใบรับรองเสียอีก
เอ สอบถามหน่อยครับ
whitebigbird Thu, 03/14/2019 - 14:58
In reply to ต้องตั้งเป็น signed bit + by McKay
เอ สอบถามหน่อยครับ ว่าทำไมมันถึง expected เป็น signed ครับ คืองงว่าทำไมต้อง 65 bit
เพราะ int ใน programming สมมติว่ามีขนาด 16 bit (2 byte)
ถ้า signed = -128 ถึง 127
ถ้า unsigned = 0 ถึง 255
แต่ในกรณี int มันเอาไปคำนวณได้ จะมีเลขติดลบจึงไม่แปลก แต่ถึงแม้มีเลขติดลบก็ยังคงใช้ 16 bit ไม่ใช่ 17 bit
แต่กรณี X.509 นี่มันจะเอาค่าติดลบไปทำไมอ่ะครับ แล้วก็งงว่าทำไมค่าติดลบถึงมีความยาว 64 bit + 1 signed bit
ผมก็ไม่เข้าใจเหมือนกันครับ
McKay Thu, 03/14/2019 - 17:12
In reply to เอ สอบถามหน่อยครับ by whitebigbird
ผมก็ไม่เข้าใจเหมือนกันครับ ตามที่ไปอ่านมาคือมันต้องมี fixed bit เพื่อทำให้ค่าเป็น positive ส่วนตามสเปกคือค่า entropy ต้องมีขั้นต่ำ 64 ตัวหน่ะครับ
อันนี้รอคุณ lew ที่น่าจะเชี่ยวชาญเรื่อง cryptography มาตอบน่าจะดีกว่าว่าทำไมถึงต้องมี fixed bit
ขอบคุณครับ มางงรวมกันครับ
whitebigbird Thu, 03/14/2019 - 17:23
In reply to ผมก็ไม่เข้าใจเหมือนกันครับ by McKay
ขอบคุณครับ มางงรวมกันครับ
ผมเดาว่ากรณีนี้มัน expect ผิด คือแทนที่จะ expect เป็น unsigned แต่ใช้ตัวแปรแบบ signed ไว้ เลยถูกตัดออกไป 1 บิท
ก็ยังคงงงๆ อยู่ดีว่าทำไมไม่ expect เป็น string ถึงแม้จะเข้าใจว่าแม้กระทั่ง IPv4 ยังมีหลายระบบที่เลือกเก็บแบบ byte int x 4
โอ๊ย งง พยายามหาอ่านก็ไม่เจอสักที