01ช่องโหว่เป็นเรื่องของทุกคน The whole chain
ลองนึกถึงร้านข้าวมันไก่ที่เราชอบกิน เจ้าของร้านต้มข้าวเอง ทำน้ำจิ้มเอง แต่ข้าวสารซื้อจากโรงสี ไก่รับจากฟาร์ม ซีอิ๊วมาจากโรงงาน ถ้าวันหนึ่งซีอิ๊วเจ้าหนึ่งปนเปื้อน ทุกร้านที่ใช้ซีอิ๊วเจ้านั้นก็พลอยมีปัญหาไปด้วย ทั้งที่ร้านเองไม่ได้ทำอะไรผิดเลย
ซอฟต์แวร์ก็เป็นแบบเดียวกันเป๊ะ แอปหรือเว็บที่เราใช้ทุกวัน ผู้พัฒนาเขียนเองจริง ๆ แค่ส่วนบนสุด ที่เหลือประกอบจาก “ชิ้นส่วนสำเร็จรูป” ที่คนอื่นเขียนไว้แล้วนับร้อยนับพันชิ้น เราเรียกชิ้นส่วนเหล่านี้ว่า ไลบรารี (library) หรือ dependency การรวมผู้ผลิต ผู้ส่งต่อ และผู้ใช้ทั้งหมดนี้เรียกว่า ห่วงโซ่อุปทานซอฟต์แวร์ (software supply chain)
บทนี้เล่าถึงจุดอ่อนสองแบบที่เกิดในห่วงโซ่นี้ แบบแรกคือ ช่องโหว่ (vulnerability) จุดบกพร่องที่เผลอทำพลาดไว้ และแบบที่สองน่ากลัวกว่า คือเมื่อมีคน จงใจวางยา ลงในชิ้นส่วนที่ทุกคนไว้ใจ ทั้งสองแบบมีจุดร่วมเดียวกัน คือมันกระทบคนจำนวนมากพร้อมกัน เพราะทุกคนใช้ชิ้นส่วนเดียวกัน
- ศัพท์น่ารู้: ช่องโหว่ (Vulnerability) vs ช่องโหว่ Zero-day
- ช่องโหว่คือจุดบกพร่องในซอฟต์แวร์ที่อาจถูกใช้โจมตีได้ ส่วน Zero-day (ช่องโหว่วันศูนย์) คือช่องโหว่ที่ ผู้พัฒนายังไม่รู้ จึงยัง “มีเวลาศูนย์วัน” ในการแก้ และยังไม่มีแพตช์ให้ใคร มันจึงอันตรายเป็นพิเศษ เพราะไม่มีใครเตรียมป้องกันได้เลย
02วงจรชีวิตของช่องโหว่ The vulnerability lifecycle
ช่องโหว่ทุกตัวมี “ชีวิต” ของมัน ตั้งแต่เกิดในโค้ดเงียบ ๆ จนถึงวันที่ถูกปิดสนิท ระหว่างทางมีสองช่วงที่อันตรายเป็นพิเศษ และการเข้าใจสองช่วงนี้คือหัวใจของบททั้งบท
FIG 01ชีวิตของช่องโหว่หนึ่งตัว
บันทึกเป็นภาพอ่านภาพนี้เป็นข้อความ
- มีช่องโหว่อยู่แล้วตั้งแต่เขียนโค้ด แต่ยังไม่มีใครรู้
- ช่วง Zero-day: ผู้โจมตีค้นพบก่อน เริ่มใช้โจมตีเงียบ ๆ ยังไม่มีแพตช์ป้องกัน
- ผู้พัฒนารู้ตัว แจ้งอย่างมีความรับผิดชอบ แล้วออกแพตช์
- ช่วง N-day: แพตช์มีแล้ว แต่หลายระบบยังไม่อัปเดต ผู้โจมตีไล่เจาะเครื่องที่ยังไม่แพตช์
- อัปเดตครบ ปิดช่องโหว่ การโจมตีเส้นนี้จบลง
คนส่วนใหญ่กลัวช่วง Zero-day เพราะมันลึกลับและป้องกันไม่ได้ ซึ่งก็น่ากลัวจริง แต่ความจริงที่หลายคนไม่รู้คือ การโจมตีที่เกิดขึ้น จริง ๆ ส่วนใหญ่อาศัยช่องโหว่แบบ N-day ต่างหาก คือช่องที่แพตช์ออกมาแล้ว รายละเอียดเปิดเผยหมดแล้ว แต่เหยื่อยัง “ขี้เกียจอัปเดต” ผู้โจมตีแค่หยิบแพตช์มาดูว่าแก้อะไร ก็รู้ทันทีว่าช่องอยู่ตรงไหน แล้วไล่ยิงเครื่องที่ยังไม่อัปเดต
- ศัพท์น่ารู้: N-day และแพตช์ (Patch)
- N-day คือช่องโหว่ที่แพตช์ออกมาแล้ว “N วัน” แต่ยังมีคนไม่อัปเดต ส่วนแพตช์คือตัวแก้ไขที่ผู้พัฒนาปล่อยมาปิดช่องโหว่ บทเรียนสำคัญ: การออกแพตช์ไม่ได้แปลว่าปลอดภัยทันที มันปลอดภัยต่อเมื่อ “ติดตั้ง” แล้วเท่านั้น
03CVE & CVSS: ทะเบียนและคะแนน CVE & CVSS
พอมีช่องโหว่เกิดขึ้นทุกวันเป็นพัน ๆ ตัว โลกก็ต้องมีวิธีเรียกชื่อให้ตรงกัน ไม่งั้นคุยกันไม่รู้เรื่อง ระบบที่ใช้กันทั่วโลกคือ CVE ย่อมาจาก Common Vulnerabilities and Exposures เป็นเหมือน “เลขทะเบียนบ้าน” ของช่องโหว่แต่ละตัว เช่น CVE-2021-44228 แปลว่าช่องโหว่ที่ขึ้นทะเบียนในปี 2021 ลำดับที่ 44228 ทุกคนทั่วโลกอ้างถึงเลขเดียวกันนี้
ทะเบียน CVE ดูแลโดยองค์กรชื่อ MITRE ภายใต้การสนับสนุนของหน่วยงานรัฐบาลสหรัฐฯ ชื่อ CISA และมีหน่วยงานที่ได้รับมอบหมายให้ออกเลข CVE (เรียกว่า CNA) อยู่ทั่วโลกกว่า 400 แห่ง เช่น บริษัทซอฟต์แวร์ใหญ่ ๆ ที่ออกเลขให้ผลิตภัณฑ์ของตัวเองได้
แต่รู้แค่ชื่อยังไม่พอ เราต้องรู้ด้วยว่า “รุนแรงแค่ไหน” ตรงนี้ใช้คะแนนชื่อ CVSS (Common Vulnerability Scoring System) ให้คะแนนจาก 0 ถึง 10 ตามความง่ายในการโจมตีและความเสียหายที่เกิดได้ รุ่นที่ใช้กันปัจจุบันคือ CVSS v4.0
FIG 02มาตรวัดความรุนแรง CVSS
บันทึกเป็นภาพอ่านภาพนี้เป็นข้อความ
- None (0.0): ไม่มีผลกระทบ
- Low (0.1–3.9): ต่ำ
- Medium (4.0–6.9): ปานกลาง
- High (7.0–8.9): สูง
- Critical (9.0–10.0): วิกฤต ต้องรีบที่สุด
Log4Shell และ xz-utils ได้คะแนนเต็ม 10.0 ซึ่งเป็นระดับวิกฤตสูงสุด
เกร็ดที่ควรรู้สำหรับคนที่จะทำงานสายนี้: ในช่วงที่ผ่านมามีการปรับวิธีทำงานของฐานข้อมูลช่องโหว่ โดยหน่วยงานกลางจะเน้นลงรายละเอียดเฉพาะช่องโหว่ที่กระทบวงกว้างหรือถูกใช้โจมตีจริงก่อน และหันไปใช้คะแนนที่ผู้ออกเลข CVE (CNA) ให้มาเป็นหลักมากขึ้น เพราะจำนวนช่องโหว่เพิ่มเร็วเกินกว่าจะให้คะแนนเองได้ทุกตัว บทเรียนคือ อย่าดูแค่ตัวเลข CVSS อย่างเดียว ต้องดูด้วยว่าช่องนั้น “ถูกใช้โจมตีจริงอยู่หรือยัง”
04แจ้งอย่างมีความรับผิดชอบ Coordinated disclosure
สมมติเราเป็นนักเรียนที่บังเอิญเจอช่องโหว่ในเว็บของบริษัทหนึ่ง เราควรทำอะไร ป่าวประกาศลงโซเชียลเลยไหม คำตอบคือ ไม่ เพราะถ้าเราประกาศก่อนที่บริษัทจะแก้ทัน คนร้ายทั้งโลกก็เห็นพร้อมกัน แล้วรีบเอาไปโจมตีก่อนมีแพตช์ เท่ากับเราเปิดช่วง Zero-day ให้คนร้ายเอง
วิธีที่ถูกต้องเรียกว่า การเปิดเผยอย่างมีการประสานงาน (coordinated disclosure) คือแจ้งผู้พัฒนาเป็นการส่วนตัวก่อน ให้เวลาเขาแก้ (ปกติ 90 วันเป็นมาตรฐานที่หลายคนใช้) แล้วค่อยเปิดเผยต่อสาธารณะพร้อมกับแพตช์ หลายบริษัทมีช่องทางรับแจ้งและโครงการให้รางวัล (bug bounty) สำหรับคนที่รายงานช่องโหว่อย่างถูกต้อง นี่คือเส้นทางของ “แฮกเกอร์หมวกขาว” ที่ถูกกฎหมายและได้รับการยกย่อง
ความเชื่อ
“เจอช่องโหว่ก็ต้องรีบประกาศให้โลกรู้ทันที จะได้เตือนทุกคน”
ความจริง
ถ้าประกาศก่อนมีแพตช์ เท่ากับบอกวิธีเจาะให้คนร้ายฟรี ๆ ในขณะที่เหยื่อยังป้องกันไม่ได้ การแจ้งผู้พัฒนาก่อนและรอให้แก้เสร็จ คือการเตือนที่ “ปลอดภัยกว่า” สำหรับทุกคน
และเมื่อแพตช์ออกมาแล้ว หน้าที่ก็ย้ายมาอยู่ที่ฝั่งผู้ใช้ คือต้อง จัดการแพตช์ (patch management) ให้เป็นระบบ รู้ว่าเครื่องไหนใช้อะไรบ้าง อัปเดตตัวสำคัญก่อน ทดสอบว่าไม่พัง แล้วทยอยปล่อย ยิ่งทำเร็ว ช่วง N-day ก็ยิ่งสั้น โอกาสโดนก็ยิ่งน้อย
05เมื่ออัปเดตกลายเป็นอาวุธ Poisoned updates
ตลอดบทที่ผ่านมา เราพร่ำบอกให้ “อัปเดตเสมอ” ซึ่งถูกต้อง แต่มีการโจมตีแบบหนึ่งที่พลิกคำแนะนำนี้กลับหัว คือเมื่อ ตัวอัปเดตเอง คือสิ่งที่มีพิษ ผู้โจมตีไม่ได้เจาะเครื่องเราโดยตรง แต่ไปเจาะที่ ผู้พัฒนาต้นทาง แล้วแอบฝังโค้ดร้ายลงในอัปเดตของจริง ก่อนที่มันจะถูกเซ็นรับรองและส่งถึงเรา
FIG 03อัปเดตของแท้ที่มีพิษแอบแฝง
บันทึกเป็นภาพอ่านภาพนี้เป็นข้อความ
- ผู้พัฒนาซอฟต์แวร์สร้างและเซ็นรับรองตัวอัปเดตของจริง
- ผู้โจมตีเจาะเข้าระบบ build แล้วแทรกโค้ดร้ายก่อนการเซ็นรับรอง อัปเดตจึงดูเป็นของแท้ทุกประการ
- ลูกค้าหลายพันองค์กรติดตั้งอัปเดตอัตโนมัติด้วยความไว้ใจ เพราะมันมาจากผู้พัฒนาตัวจริง
06Log4Shell: ช่องโหว่ในของที่ลืม Log4Shell
คราวนี้มาดูจุดอ่อนอีกแบบ ไม่ใช่การจงใจวางยา แต่เป็นช่องโหว่ธรรมดาในชิ้นส่วนเล็ก ๆ ที่บังเอิญถูกใช้กันทั้งโลก ชื่อของมันคือ Log4Shell และมันสอนบทเรียนสำคัญข้อหนึ่ง: เราป้องกันของที่เราไม่รู้ว่าเราใช้อยู่ไม่ได้
พระเอกของเรื่องคือไลบรารีชื่อ Log4j เป็นเครื่องมือเล็ก ๆ สำหรับ “จดบันทึก” (logging) ว่าโปรแกรมทำอะไรไปบ้าง ฟังดูไม่มีพิษภัย แต่มันถูกฝังอยู่ในแอป เซิร์ฟเวอร์ และบริการนับไม่ถ้วนทั่วโลก ปัญหาคือมันมักไม่ได้ถูกเรียกใช้ตรง ๆ แต่ “ติดมา” กับไลบรารีอื่นอีกที ฝังลึกหลายชั้นจนเจ้าของแอปเองไม่รู้ด้วยซ้ำว่ามีมันอยู่
FIG 04Log4j ที่ซ่อนอยู่ลึกในต้นไม้
บันทึกเป็นภาพอ่านภาพนี้เป็นข้อความ
- แอปของคุณ: คุณเขียนเองแค่ส่วนบนสุด
- ไลบรารีที่คุณเรียกใช้โดยตรง เช่น เฟรมเวิร์กทำเว็บ
- ไลบรารีย่อยอีกชั้น ที่มาพ่วงกับไลบรารีข้างบนเองโดยคุณไม่ได้เลือก
- Log4j (CVE-2021-44228) ฝังลึกอยู่หลายชั้น คุณไม่เคยเรียกมันตรง ๆ และไม่รู้ว่ามันอยู่ในแอป
กิ่งอื่นที่ไม่ได้ลาก Log4j มาด้วย ก็ปลอดภัยจากช่องโหว่นี้
07xz-utils: ประตูหลังที่เกือบสำเร็จ The xz backdoor
คดีสุดท้ายน่าขนลุกที่สุด เพราะมันรวมทั้งการวางยาและความเปราะบางของโลกโอเพนซอร์สไว้ด้วยกัน และมันเกือบสำเร็จแบบที่แทบไม่มีใครทันสังเกต
xz-utils เป็นเครื่องมือบีบอัดไฟล์เล็ก ๆ ที่ฝังอยู่ในระบบปฏิบัติการ Linux แทบทุกตัวบนโลก ดูแลโดยอาสาสมัครไม่กี่คน ในปี 2024 มีคนใช้ชื่อว่า “Jia Tan” ค่อย ๆ เข้ามาช่วยพัฒนาอย่างขยันขันแข็งเป็นเวลากว่าสองปี จนได้รับความไว้ใจให้เป็นผู้ดูแลร่วม ระหว่างนั้นยังมีบัญชีลึกลับหลายบัญชีคอยกดดันผู้ดูแลคนเดิมให้ปล่อยอำนาจ เมื่อได้สิทธิ์แล้ว เขาก็ค่อย ๆ แอบฝัง ประตูหลัง (backdoor) ลงในโค้ด อย่างแนบเนียนจนแทบมองไม่เห็น
คดี xz สอนเราว่า ในโลกโอเพนซอร์ส “ความไว้ใจ” เองก็เป็นช่องโหว่ได้ ผู้โจมตีที่อดทนพอจะใช้เวลาเป็นปี ๆ สะสมความน่าเชื่อถือ แล้วค่อยใช้มันในวินาทีสำคัญ
08ป้องกัน: SBOM & ลายเซ็น Defending the chain
เรื่องห่วงโซ่อุปทานฟังดูใหญ่โตเกินตัวสำหรับคนทั่วไป แต่หลักคิดในการป้องกันกลับตรงไปตรงมา และนักพัฒนารุ่นใหม่ควรรู้ไว้ตั้งแต่ต้น มันมีสี่ชั้น
FIG 05สี่ชั้นป้องกันห่วงโซ่อุปทาน
บันทึกเป็นภาพอ่านภาพนี้เป็นข้อความ
- รู้ว่ามีอะไรอยู่ในระบบ (SBOM): ทำบัญชีรายการส่วนประกอบซอฟต์แวร์ทั้งหมด เหมือนฉลากโภชนาการ
- ตรวจลายเซ็นดิจิทัล (Code signing): รับเฉพาะอัปเดตที่เซ็นรับรองถูกต้องจากผู้พัฒนาตัวจริง
- ติดตามประกาศช่องโหว่: เฝ้าดู CVE และคำแนะนำจากผู้พัฒนา รู้ก่อนว่ามีอะไรต้องรีบแพตช์
- จัดการแพตช์ให้เป็นระบบ: มีขั้นตอนทดสอบและอัปเดตที่รวดเร็ว ลดช่วง N-day ให้สั้นที่สุด
- ศัพท์น่ารู้: SBOM และ Code signing
- SBOM (Software Bill of Materials) คือ “บัญชีรายการส่วนผสม” ของซอฟต์แวร์ บอกว่าข้างในประกอบด้วยไลบรารีอะไรบ้าง รุ่นไหน เหมือนฉลากโภชนาการบนห่ออาหาร ส่วน Code signing คือการที่ผู้พัฒนาเซ็นรับรองโค้ดด้วยลายเซ็นดิจิทัล เพื่อให้ผู้ใช้ตรวจได้ว่าของจริงและไม่ถูกแก้ไขระหว่างทาง
กฎระเบียบของโลกก็กำลังขยับไปทางนี้ เช่น กฎหมายความมั่นคงไซเบอร์ของสหภาพยุโรป (Cyber Resilience Act) ที่เริ่มมีผลบังคับหน้าที่รายงานช่องโหว่ในช่วงเดือนกันยายน 2026 ซึ่งผลักดันให้ผู้ผลิตต้องรับผิดชอบความปลอดภัยของซอฟต์แวร์ตลอดอายุการใช้งานมากขึ้น รวมถึงการจัดทำ SBOM
สำหรับนักเรียนหรือนักพัฒนามือใหม่ เริ่มง่าย ๆ ได้เลย: ใช้ไลบรารีจากแหล่งทางการ หมั่นอัปเดต dependency ให้เป็นรุ่นใหม่ และลองใช้เครื่องมือตรวจช่องโหว่ในโปรเจกต์ (dependency scanning) ที่หลายแพลตฟอร์มมีให้ฟรี แค่นี้ก็ปิดช่องส่วนใหญ่ได้แล้ว
09สรุปให้จำ Recap
ในโลกที่ซอฟต์แวร์ทุกชิ้นสร้างจากชิ้นส่วนของคนอื่น ความปลอดภัยของเราผูกกับความปลอดภัยของทั้งห่วงโซ่ ห้าข้อนี้คือแก่นของบท
- Zero-day คือช่องที่ยังไม่มีแพตช์ แต่การโจมตีจริงส่วนใหญ่อาศัยช่วง N-day ที่คนขี้เกียจอัปเดต
- CVE คือเลขทะเบียน CVSS คือคะแนนความรุนแรง 0–10 ระดับ Critical ต้องรีบที่สุด
- เจอช่องโหว่ให้แจ้งผู้พัฒนาก่อน อย่าป่าวประกาศก่อนมีแพตช์ (coordinated disclosure)
- อัปเดตเองก็ถูกวางยาได้ ถ้าต้นทางถูกเจาะ อย่างคดี SolarWinds ตรวจลายเซ็นช่วยได้
- รู้ว่ามีอะไรในระบบด้วย SBOM จะได้ตอบได้ทันทีว่าช่องโหว่ใหม่กระทบเราไหม
ลองทบทวนดู
ทำไมช่องโหว่ Zero-day ถึงอันตรายเป็นพิเศษ
เพราะผู้พัฒนายังไม่รู้ว่ามีช่องนี้ จึงยังไม่มีแพตช์ให้ใครป้องกัน (“มีเวลาศูนย์วันในการแก้”) ผู้โจมตีที่รู้ก่อนจึงเจาะได้โดยไม่มีใครตั้งตัว
ทำไมการโจมตีจริงส่วนใหญ่กลับใช้ช่องโหว่ N-day ไม่ใช่ Zero-day
เพราะ Zero-day หายากและมีค่า แต่ N-day มีอยู่เกลื่อน คือช่องที่แพตช์ออกแล้วและเปิดเผยวิธีแก้หมดแล้ว ผู้โจมตีแค่ดูว่าแพตช์แก้อะไร ก็รู้ช่อง แล้วไล่ยิงเครื่องที่ยังไม่อัปเดต ซึ่งมีเยอะมาก
ถ้าเราบังเอิญเจอช่องโหว่ในเว็บของบริษัทหนึ่ง ควรทำอย่างไร
แจ้งบริษัทเป็นการส่วนตัวก่อน ให้เวลาเขาแก้ แล้วค่อยเปิดเผยพร้อมแพตช์ (coordinated disclosure) ไม่ควรประกาศลงโซเชียลทันที เพราะจะเท่ากับเปิดช่วง Zero-day ให้คนร้ายทั้งโลกในขณะที่เหยื่อยังป้องกันไม่ได้
คดี SolarWinds ต่างจากช่องโหว่ทั่วไปอย่างไร
มันไม่ใช่จุดบกพร่องที่เผลอทำพลาด แต่เป็นการ “จงใจวางยา” ผู้โจมตีเจาะระบบสร้างซอฟต์แวร์ของผู้พัฒนา แล้วฝังโค้ดร้ายในอัปเดตของจริงก่อนเซ็นรับรอง อัปเดตที่ติดเชื้อจึงมีลายเซ็นถูกต้อง และถูกลูกค้าติดตั้งด้วยความไว้ใจ
SBOM ช่วยเราตอน Log4Shell ได้อย่างไร
SBOM คือบัญชีรายการส่วนประกอบของซอฟต์แวร์ ถ้ามีไว้ก่อน พอ Log4Shell โผล่มา เราเปิดดูได้ทันทีว่าแอปไหนของเราใช้ Log4j รุ่นไหนบ้าง แทนที่จะเสียเวลาเป็นวัน ๆ ไล่ค้นหาเองเหมือนที่หลายองค์กรเจอ