สรุปสั้น
ผู้โจมตีเข้าไปแก้ไขไฟล์จาวาสคริปต์ที่บริษัท Adform ผู้ให้บริการเทคโนโลยีโฆษณาออนไลน์ส่งให้เว็บไซต์ลูกค้าใช้งาน เปลี่ยนให้มันกลายเป็นเครื่องมือฝั่งเบราว์เซอร์ที่คอยเขียนทับที่อยู่กระเป๋าเงินคริปโทเคอร์เรนซี ไฟล์ที่ถูกแก้คือ trackpoint-async.js ซึ่งให้บริการจากโดเมน s2.adform[.]net และถูกฝังไว้บนเว็บไซต์ลูกค้าจำนวนมากเพื่อวัดผลโฆษณา การเจาะทรัพยากรที่ใช้ร่วมกันเพียงจุดเดียวจึงเปิดทางเข้าสู่เว็บไซต์ปลายทางที่ไม่เกี่ยวข้องกันเลยได้พร้อมกัน ซึ่งทำให้เหตุการณ์นี้เข้านิยามการโจมตีแบบ supply chain เต็มรูปแบบ
บริษัท Adform ระบุว่าตรวจพบเหตุการณ์เมื่อวันที่ 27 กรกฎาคม 2569 ได้ลบโค้ดอันตรายออก แจ้งลูกค้าที่ได้รับผลกระทบ และรายงานต่อหน่วยงานรัฐแล้ว พร้อมเตือนผู้ใช้ให้ล้างแคชของเบราว์เซอร์ เพราะไฟล์เวอร์ชันที่ถูกแก้ไขอาจยังค้างอยู่ในแคชแม้จะแก้ต้นทางไปแล้ว และให้ตรวจสอบที่อยู่กระเป๋าทุกครั้งก่อนโอนเงิน บริษัทยังระบุว่าโค้ดชุดนี้ไม่ได้ออกแบบมาเพื่อติดตั้งซอฟต์แวร์หรือฝังตัวถาวรบนเครื่อง และทำงานเฉพาะขณะที่หน้าเว็บที่ได้รับผลกระทบยังเปิดค้างอยู่เท่านั้น
ผู้เปิดเผยเรื่องนี้ต่อสาธารณะคือนาย Kevin Beaumont นักวิจัยด้านความปลอดภัยอิสระ ซึ่งเขียนว่า “ต่อให้คุณสังเกตเห็นว่าที่อยู่ผิดแล้วคัดลอกใหม่ มันก็จะเข้าไปเปลี่ยนซ้ำอยู่ดี” และรายงานว่าทั้งไฟล์ URL โดเมน และหมายเลข IP ที่เกี่ยวข้อง ไม่ถูกตรวจจับบน VirusTotal เลยในเวลานั้น ส่วนนาย Max Maass ได้เผยแพร่สำเนาสคริปต์ที่ดักจับไว้ได้เมื่อวันที่ 27 กรกฎาคม ซึ่งกลายเป็นหลักฐานหลักที่ใช้วิเคราะห์พฤติกรรมของโค้ดชุดนี้
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 1 สิงหาคม พ.ศ. 2569 ว่า ผู้ที่เข้าเว็บไซต์ซึ่งฝังสคริปต์ที่ได้รับผลกระทบในวันที่ 27 กรกฎาคม แล้วคัดลอกที่อยู่กระเป๋า Bitcoin, Ethereum หรือ Tron มีความเป็นไปได้ว่าสิ่งที่วางลงไปคือที่อยู่คนละอันที่โค้ดอันตรายใส่เข้ามาแทน โดยตัวอย่างสคริปต์ที่ดักจับไว้ได้ยังเขียนทับที่อยู่ซึ่งผู้ใช้พิมพ์ลงช่องกรอกโดยตรงด้วย การคัดลอกผ่านคลิปบอร์ดจึงไม่ใช่เส้นทางเดียวที่ถูกสลับค่า
เอกสารการติดตั้งของ Adform ระบุว่าโค้ดติดตามผลนี้สามารถตั้งให้ทำงานบนหน้าเดียว บางส่วนของเว็บไซต์ หรือทั้งเว็บไซต์แบบไม่มีเงื่อนไขก็ได้ นั่นหมายความว่าเว็บไซต์ปลายทางแต่ละแห่งอาจได้รับสคริปต์ที่ถูกแก้ไขในระดับความครอบคลุมต่างกันไป และผู้โจมตีไม่จำเป็นต้องเจาะเว็บไซต์เหล่านั้นทีละแห่งเลย เพียงแก้ไฟล์ที่ใช้ร่วมกันไฟล์เดียวก็เพียงพอ

ไทม์ไลน์ที่เปิดเผยต่อสาธารณะยังไม่ลงรอยกัน ประกาศของ Adform ระบุวันที่ได้รับผลกระทบไว้ที่ 27 กรกฎาคมเพียงวันเดียว ขณะที่นาย Kevin Beaumont ระบุว่าเขาเห็นกิจกรรมที่เป็นอันตรายผ่าน Adform มาตลอดสัปดาห์ที่ผ่านมา ช่องว่างของระยะเวลานี้เองที่ทำให้ยังประเมินขอบเขตการเปิดรับความเสี่ยงอย่างมีหลักฐานรองรับไม่ได้
อีกจุดที่ยังขัดกันคือเรื่องการส่งข้อมูลผู้เข้าชมออกไปภายนอก บริษัท Adform ระบุว่าไม่พบหลักฐานว่าโค้ดดังกล่าวส่งหมายเลข IP ของผู้เข้าชมหรือข้อมูลว่าผู้เข้าชมเปิดเว็บไซต์ใดออกไป แต่ในประกาศเหตุการณ์ฉบับเดียวกันก็เขียนไว้ว่า “การวิเคราะห์เชิงเทคนิคบ่งชี้ว่าการส่งข้อมูลลักษณะนั้นอาจเป็นไปได้” ซึ่งสอดคล้องกับตัวอย่างสคริปต์ที่มีคำสั่งสร้างคำร้องขอ HTTP ส่งชื่อโฮสต์และพาธของหน้าเว็บที่ผู้ใช้กำลังเปิดอยู่ออกไปยังเซิร์ฟเวอร์ภายนอกจริง เพียงแต่ยังพิสูจน์จากตัวอย่างไม่ได้ว่าคำร้องขอนั้นไปถึงผู้ควบคุมหรือไม่
ข้อมูลสำคัญอีกหลายอย่างยังหายไปจากภาพรวม ทั้งจำนวนเว็บไซต์ที่ฝังไฟล์นี้ จำนวนผู้เข้าชมที่ได้รับผลกระทบ วิธีที่ผู้โจมตีเข้าถึงเส้นทางเผยแพร่ไฟล์ของ Adform ได้ และยังไม่มีการยืนยันว่ามีเงินถูกโอนผิดที่ไปแล้วหรือไม่ ประกาศเหตุการณ์ฉบับสาธารณะของ Adform เองก็ไม่ได้แนบตัวบ่งชี้การถูกบุกรุกไว้เลย ส่วนตัวเลขขนาดของแพลตฟอร์มนั้น รายงานประจำปี 2568 ของบริษัทระบุว่ามีลูกค้าราว 1,800 ราย แสดงโฆษณาได้ราว 1.5 พันล้านครั้งต่อวัน และให้บริการในกว่า 180 ประเทศ ขณะที่เว็บไซต์ Cyber Security News รายงานตัวเลขที่สูงกว่ามากคือราว 14,000 ธุรกิจและส่วนแบ่งตลาด demand-side platform เกือบร้อยละ 30 ไม่ว่าจะยึดตัวเลขชุดใด ทั้งหมดนี้อธิบายขนาดของแพลตฟอร์ม ไม่ใช่ขนาดของเหตุการณ์ ตัวเลขที่มีประโยชน์กว่าคือจำนวนการโหลดหน้าเว็บที่ได้รับไฟล์เวอร์ชันอันตรายไปจริง ซึ่ง Adform ยังไม่เผยแพร่ และบริษัทยังไม่ได้ระบุตัวผู้ก่อเหตุต่อสาธารณะ
วิธีการโจมตี
ตัวอย่างสคริปต์ที่ดักจับไว้ได้แสดงให้เห็นว่าโค้ดอันตรายสองบล็อกถูกต่อท้ายไลบรารีของจริง โดยสตริงที่ใช้แทนที่ที่อยู่กระเป๋าถูกกวนด้วยกุญแจ XOR ขนาดหกไบต์เพื่อไม่ให้อ่านเจอตรง ๆ จากการดูโค้ดผ่าน ๆ
บล็อกแรกทำหน้าที่เฝ้าดูอีเวนต์การคัดลอก พยายามอ่านค่าจากคลิปบอร์ดทุก ๆ สี่วินาที และแทนที่ที่อยู่ที่ตรงกับรูปแบบที่กำหนดไว้ นอกจากนี้ยังพยายามส่งคำร้องขอ HTTP ไปยัง 84.32.102[.]230:7744 ตั้งแต่ตอนโหลดหน้าเว็บ โดยแนบชื่อโฮสต์และพาธของหน้าที่ผู้เข้าชมกำลังเปิดอยู่ไปด้วย
บล็อกที่สองทำงานลึกกว่านั้น มันไล่อ่านโหนดข้อความทั้งหมดในเอกสาร เขียนทับค่าในอิลิเมนต์ประเภท input, textarea และ contenteditable แล้วคืนตำแหน่งเคอร์เซอร์กลับที่เดิมหลังเขียนทับเสร็จ เพื่อไม่ให้ผู้ใช้รู้สึกผิดสังเกต ที่สำคัญคือมันเข้าไปแทรก setter ของค่าใน input และ textarea ทำให้แม้แต่การเขียนค่าโดยตัวสคริปต์ของเว็บไซต์เองก็ถูกสลับระหว่างทาง และยังดักอีเวนต์ copy, cut, paste และ input ไว้ทั้งหมด ทั้งสองบล็อกฝังสตริงที่อยู่สำหรับแทนที่ของ Bitcoin, Ethereum และ Tron ไว้ตายตัว โดยนาย Kevin Beaumont ระบุว่าที่อยู่ที่ใช้แทนที่ดูจะแตกต่างกันไปในแต่ละกรณี
จุดที่ทำให้การโจมตีนี้รอดสายตาระบบป้องกันคือโค้ดอันตรายอาศัยชื่อเสียงของโดเมนผู้ให้บริการโฆษณาที่เว็บไซต์เชื่อถืออยู่แล้ว ตัวกรองสคริปต์จากบุคคลที่สามซึ่งปกติจะสะดุดกับโดเมนแปลกหน้าจึงปล่อยผ่าน และเมื่อไม่มีเครื่องมือใดบน VirusTotal ตรวจจับได้ ผู้ดูแลเว็บไซต์ปลายทางก็แทบไม่มีทางรู้เลยว่าหน้าเว็บของตัวเองกำลังส่งโค้ดขโมยคริปโทให้ผู้เข้าชม
ผลกระทบ
ผู้ที่รับความเสี่ยงโดยตรงคือผู้เข้าชมเว็บไซต์ทั่วไปที่บังเอิญทำธุรกรรมคริปโทในช่วงเวลาที่เปิดหน้าเว็บซึ่งฝังสคริปต์นี้อยู่ ความเสียหายเกิดขึ้นได้ทันทีในธุรกรรมเดียวและย้อนคืนไม่ได้ เพราะการโอนคริปโทที่ยืนยันแล้วไม่มีกลไกเรียกเงินคืนแบบระบบธนาคาร สิ่งที่ทำให้กลโกงนี้ได้ผลสูงคือธรรมชาติของที่อยู่กระเป๋าซึ่งเป็นสตริงยาวและสุ่ม คนส่วนใหญ่จึงคัดลอกแล้ววางโดยไม่ตรวจซ้ำทีละตัวอักษร
สำหรับเจ้าของเว็บไซต์ เหตุการณ์นี้ชี้ให้เห็นว่าความเสี่ยงไม่ได้อยู่ที่โค้ดของตัวเองเลย แต่อยู่ที่สคริปต์บุคคลที่สามซึ่งฝังไว้เพื่อวัดผลโฆษณาและทำงานด้วยสิทธิ์เดียวกับหน้าเว็บทั้งหน้า เมื่อผู้ให้บริการรายเดียวถูกเจาะ เว็บไซต์ปลายทางทุกแห่งจึงกลายเป็นช่องทางแจกจ่ายโค้ดอันตรายโดยที่เจ้าของไม่ได้ทำอะไรผิดและไม่มีร่องรอยผิดปกติในระบบของตัวเอง
ที่ต้องระวังเป็นพิเศษคือคำแนะนำเรื่องแคช เพราะไฟล์จาวาสคริปต์แบบนี้มักถูกเบราว์เซอร์และ CDN เก็บไว้ ผู้ใช้บางรายจึงอาจยังได้รับไฟล์เวอร์ชันที่ถูกแก้ไขอยู่แม้ต้นทางจะแก้ไขเรียบร้อยแล้ว หน้าต่างความเสี่ยงจริงจึงยาวกว่าช่วงเวลาที่ไฟล์อันตรายถูกให้บริการอยู่บนเซิร์ฟเวอร์ และเมื่อประกาศของ Adform กับสิ่งที่นักวิจัยเห็นยังไม่ตรงกันเรื่องระยะเวลา การประเมินว่าใครอยู่ในข่ายเสี่ยงบ้างจึงยังทำได้ไม่ครบถ้วน
คำแนะนำ
- ผู้ที่เคยเข้าเว็บไซต์ทั่วไปแล้วคัดลอกหรือพิมพ์ที่อยู่กระเป๋าคริปโทในช่วงปลายเดือนกรกฎาคม 2569 ควรตรวจสอบธุรกรรมย้อนหลังว่าปลายทางตรงกับที่ตั้งใจโอนหรือไม่
- ล้างแคชของเบราว์เซอร์ตามคำแนะนำของ Adform เพื่อให้แน่ใจว่าไม่มีไฟล์สคริปต์เวอร์ชันที่ถูกแก้ไขค้างอยู่ในเครื่อง
- ตรวจที่อยู่กระเป๋าปลายทางทุกครั้งก่อนกดยืนยัน โดยเทียบอย่างน้อยตัวอักษรต้นและท้ายหลายตัว หรือใช้สมุดที่อยู่ (address book) ของกระเป๋าแทนการคัดลอกวางทุกครั้ง
- ผู้ดูแลเว็บไซต์ที่ใช้บริการของ Adform ควรตรวจสอบรายการสคริปต์บุคคลที่สามทั้งหมดบนหน้าเว็บ และเฝ้าดูทราฟฟิกขาออกที่วิ่งไปยังโครงสร้างพื้นฐานของผู้โจมตีตามตารางด้านล่าง
- พิจารณาใช้ Subresource Integrity หรือ Content Security Policy ที่จำกัดปลายทางของสคริปต์ เพื่อลดผลกระทบเมื่อผู้ให้บริการภายนอกถูกเจาะในอนาคต
- อย่าใช้ผลตรวจจากบริการสแกนมัลแวร์เป็นเกณฑ์เดียวในการตัดสินว่าสคริปต์ปลอดภัย เพราะในเหตุการณ์นี้ไม่มีตัวใดแจ้งเตือนเลยในช่วงที่การโจมตีกำลังดำเนินอยู่
Indicators of Compromise (IoCs)
ตัวบ่งชี้ด้านล่างถูก defang ไว้แล้ว (เปลี่ยนจุดเป็น
[.]และhttpเป็นhxxp) เพื่อป้องกันการคลิกโดยไม่ตั้งใจ
| ประเภท | ค่า | คำอธิบาย |
|---|---|---|
| IP Address | 84.32.102[.]230 | เซิร์ฟเวอร์ของผู้โจมตีที่รับสัญญาณ (พอร์ต 7744) |
| Domain | s2.adform[.]net | ซับโดเมนของ Adform ที่ให้บริการสคริปต์ที่ถูกแก้ไข |
| URL | hxxps://s2[.]adform.net/banners/scripts/st/trackpoint-async.js | สคริปต์ติดตามผลที่ถูกฝังโค้ดสลับที่อยู่กระเป๋า |
| File Hash (SHA-256) | 02ff86c7f9fe609a753ff15bda90baa3c3e0d4a2e559ec4fcf8a3de0954b7c55 | ไฟล์เพย์โหลดอันตราย (ไม่ถูกตรวจจับบน VirusTotal) |
| Beacon URL Pattern | hxxp://84.32.102[.]230:7744/p?h=<domain>&u=<path> | รูปแบบคำร้องขอที่ส่งชื่อโดเมนและพาธของหน้าเว็บออกไป |
