- GPT5.6 Sol Ultra วิเคราะห์ WordPress รุ่นเสถียรล่าสุด และสร้างห่วงโซ่การโจมตีตั้งแต่ SQL injection ก่อนยืนยันตัวตน ไปจนถึงการสร้างบัญชีผู้ดูแลระบบและการรันโค้ดจากระยะไกล (RCE) ได้ภายในราว 10 ชั่วโมง
- จุดเริ่มต้นคือ ความไม่ตรงกันของดัชนีอาร์เรย์ใน Batch API ที่มีมาตั้งแต่ WordPress 5.6 โดยผสานคำขอ Batch แบบเรียกซ้อนเพื่อข้ามข้อจำกัดของ GET และการตรวจสอบพารามิเตอร์
- หลังทำให้เกิด UNION injection ผ่านสตริง
author_excludeที่ไม่ได้ตรวจสอบแล้ว ก็ใส่โพสต์ที่ถูกดัดแปลงลงในหน่วยความจำแคช และใช้ประโยชน์จาก oEmbed cache, changeset, การอ้างอิงวนซ้ำ, และ hook ต่อเนื่องกัน - ใช้
user_id: 1ในcustomize_changesetเพื่อยกระดับเป็นสิทธิ์ผู้ดูแลชั่วคราว แล้วเรียกคำขอ Batch ซ้ำผ่าน hookparse_requestเพื่อสร้างผู้ดูแลใหม่ ก่อนอัปโหลด ZIP ของปลั๊กอินแบ็กดอร์เพื่อไปถึงการรันโค้ด - ค่าใช้จ่ายเมื่อคำนวณตามสัดส่วนจากการใช้โควตารายสัปดาห์ 50% ของแพ็กเกจสมาชิก 200 ดอลลาร์ต่อเดือนอยู่ที่ราว 25 ดอลลาร์ และบทบาทของมนุษย์มีแนวโน้มจะขยับไปสู่การกำกับงานวิจัยระดับสูง เช่น การเลือกผลิตภัณฑ์และพื้นผิวการโจมตี รวมถึงการปรับพรอมป์ต์
กระบวนการค้นพบและเงื่อนไขการทดลอง
- นำ พรอมป์ต์ ที่ OpenAI เปิดเผยว่าใช้แก้ปัญหาสมมติฐาน Cycle Double Cover มาปรับสำหรับงานวิจัยด้านความปลอดภัย แล้วป้อนให้ GPT5.6 Sol Ultra
- โคลน WordPress รุ่นเสถียรล่าสุดไว้ใน
main/และลบไดเรกทอรี.gitออก พร้อมเตรียมไดเรกทอรีthird_party/เปล่าไว้เพื่อให้ตรวจสอบโค้ด dependency ได้ - พรอมป์ต์สั่งให้ใช้ เอเจนต์ได้สูงสุด 4 ตัว แบบขนาน และคงเส้นทางโจมตีที่หลากหลายไว้อย่างน้อย 6 ชั่วโมง
- สำรวจการแยกวิเคราะห์อินพุต, ชุดอักขระ, การอัปโหลดไฟล์, การจัดการข้อผิดพลาด, เส้นทางภายใน, serialization, แคช, race condition, การเข้ารหัส, ชนิดข้อมูล, mass assignment เป็นต้น
- ลงทะเบียนตระกูลของแนวทาง และถ้าเอเจนต์เริ่มกระจุกตัวกับกลยุทธ์ใดก็ย้ายไปยังพื้นที่ที่สำรวจน้อยกว่า
- บั๊กที่เป็นรูปธรรมจะถูกตรวจยืนยันซ้ำโดยเอเจนต์ฝ่ายตรงข้าม และแม้เส้นทางที่ล้มเหลวก็จะถูกเปิดใหม่เมื่อมีกลไกใหม่เกิดขึ้น
- จำกัดให้ค้นหาช่องโหว่ใหม่จาก ซอร์สโค้ดเอง โดยไม่ใช้อินเทอร์เน็ต เบาะแส ความต่างของประวัติการเปลี่ยนแปลง หรือเวอร์ชันแพตช์
- เพื่อหลีกเลี่ยงการตั้งค่าที่ไม่สมจริงหรือเงื่อนไขที่ผู้โจมตีทำไม่ได้ จึงกำหนดเป้าหมายชัดเจนว่าเป็น “RCE ก่อนยืนยันตัวตนบนการติดตั้ง production ทั่วไปที่ใช้ MySQL”
- ผ่านไปราว 6 ชั่วโมง โมเดลพบ SQL injection ก่อนยืนยันตัวตน และยืนยันซ้ำได้ภายในไม่กี่นาทีบนเซิร์ฟเวอร์ WordPress ระยะไกลเริ่มต้นด้วยการดึงอีเมลผู้ดูแลระบบ
- เมื่อขอให้ยกระดับไปสู่ RCE เพิ่ม อีกประมาณ 4 ชั่วโมงต่อมา ก็สร้างห่วงโซ่จาก SQL injection แบบอ่านอย่างเดียวไปสู่สิทธิ์ผู้ดูแลได้สำเร็จ โดยไม่ต้องแคร็กรหัสผ่านหรือคำนวณออฟไลน์
- เวลาทำงานรวมคือ มากกว่า 10 ชั่วโมงเล็กน้อย และใช้โควตารายสัปดาห์ไป 50% ค่าใช้จ่ายเมื่อเทียบสัดส่วนกับค่าสมาชิกรายเดือน 200 ดอลลาร์อยู่ที่ราว 25 ดอลลาร์
- ก่อนเปิดเผยข้อมูล ได้เว้นช่วงสุดสัปดาห์ให้ผู้ดูแลอัปเกรด WordPress และระหว่างนั้น Calif กับ Hacktron ก็ยืนยันห่วงโซ่ทั้งหมดได้อย่างอิสระก่อน PoC อื่นบน GitHub
- อินสแตนซ์ที่กำลังใช้งานสามารถตรวจสอบความเสี่ยงได้ที่ wp2shell.com
ความไม่สอดคล้องในการตรวจสอบของ Batch API
- Batch API ที่เพิ่มเข้ามาใน WordPress 5.6 ประมวลผลคำขอ API เสมือนหลายรายการในคำขอเดียว แม้จะเข้าถึง endpoint เองได้โดยไม่ต้องยืนยันตัวตน แต่ข้อมูลยืนยันตัวตนจะถูกส่งต่อให้กับคำขอย่อยแต่ละรายการ
- โดยปกติคำขอ REST จะถูกประมวลผลตามลำดับดังนี้
- ตรวจสอบค่าที่จำเป็นและความถูกต้องด้วย
has_valid_params() - ทำความสะอาดค่าด้วย
sanitize_params() - เรียก permission callback
- เรียก endpoint callback
- ตรวจสอบค่าที่จำเป็นและความถูกต้องด้วย
- Batch API แยกการตรวจสอบกับการประมวลผลออกเป็นสองลูปเพื่อประสิทธิภาพ
- ลูปแรกตรวจสอบและทำความสะอาดทุกคำขอ
- ลูปที่สองตรวจผลการตรวจสอบ แล้วเรียก permission และ endpoint callback
- การติดตั้งใช้งานสมมติว่าอินเด็กซ์เดียวกันในผลการจับคู่ route คือ
$matchesและผลการตรวจสอบคือ$validationจะสอดคล้องกัน - หากคำขอที่ไม่ถูกต้องเข้าไปในกิ่ง
is_wp_error($single_request)ระบบจะเพิ่มรายการเข้า$validationแต่จะไม่เพิ่มเข้า$matchesเพราะcontinue- หลังจากนั้น รายการทั้งหมดใน
$matchesจะเลื่อนไปหนึ่งตำแหน่ง - พารามิเตอร์ของคำขอหนึ่งจึงอาจถูกตรวจสอบด้วยกฎของอีกคำขอ แล้วนำไปรันใน handler ของ endpoint ที่เดิมไม่ได้ตั้งใจ
- หลังจากนั้น รายการทั้งหมดใน
- เมื่อใช้ ความไม่ตรงกันของดัชนี นี้ ก็สามารถนำผลการตรวจสอบจาก endpoint อื่นที่ไม่ทำความสะอาดพารามิเตอร์มาใช้กับ endpoint ที่รองรับ Batch ได้
SQL injection ที่เกิดใน author__not_in
GET /wp/v2/postsใช้ตัวแปร query ภายในauthor__not_inเพื่อยกเว้นผู้เขียนบางรายออกจากผลลัพธ์- หากค่าเป็นอาร์เรย์ จะใช้
absintกับแต่ละสมาชิกเพื่อแปลงเป็นจำนวนเต็ม แต่ถ้าเป็นค่า scalar จะนำไปimplodeตรง ๆ แล้วแทรกเข้าเงื่อนไขNOT INของ SQL - ในการเรียกใช้งานปกติ พารามิเตอร์สาธารณะ
author_excludeต้องเป็นอาร์เรย์ของจำนวนเต็ม จึงไม่เห็นปัญหานี้ - แต่เมื่ออาศัยความไม่ตรงกันของดัชนีใน Batch ก็สามารถตรวจสอบสตริง
author_excludeด้วยกฎของDELETE /wp/v2/posts/1ซึ่งไม่รู้จักพารามิเตอร์นี้ แล้วส่งต่อไปยังGET /wp/v2/postsได้ - ข้อจำกัดที่ Batch API ไม่ยอมให้มีคำขอย่อยแบบ GET ก็ถูกข้ามด้วย คำขอ Batch แบบเรียกซ้อน
- Batch ชั้นนอกทำให้เกิดความไม่ตรงกันของดัชนีเพื่อข้ามการตรวจสอบ
methodของคำขอชั้นใน - Batch ชั้นในทำให้เกิดความไม่ตรงกันของดัชนีอีกครั้งเพื่อข้ามการตรวจสอบ
author_exclude
- Batch ชั้นนอกทำให้เกิดความไม่ตรงกันของดัชนีเพื่อข้ามการตรวจสอบ
- เมื่อนำค่าอย่าง
0) OR 1=1 --ไปใส่ ก็จะได้แถวโพสต์ทั้งหมดกลับมา ใช้ยืนยันการฉีดได้ - จากนั้นสามารถใช้ UNION-based injection เพื่อสร้างแถวที่มีรูปแบบเหมือน
wp_postsและรั่วค่าฐานข้อมูลตามต้องการ - เนื่องจากรหัสผ่าน โทเค็นรีเซ็ต และ API key ถูกแฮชในฐานข้อมูล การรั่วข้อมูลเพียงอย่างเดียวจึงยังไม่พอให้ยึดบัญชีได้ หากรหัสผ่านผู้ดูแลไม่ได้อ่อนแอ
การดัดแปลงแคชโพสต์ภายในคำขอ
- WordPress จะเก็บอ็อบเจ็กต์
WP_Postที่ถูกอ้างถึงซ้ำภายในคำขอเดียวไว้ใน แคชหน่วยความจำ เพื่อลดการไปกลับฐานข้อมูล - หากคืนค่าแถวโพสต์ปลอมผ่าน UNION injection ผู้โจมตีก็สามารถใส่ค่าที่ต้องการลงในแคชได้ทั้ง ID ของโพสต์ ชนิด สถานะ ความสัมพันธ์กับโพสต์แม่ เนื้อหา และฟิลด์อื่นอีกมาก
- การตอบกลับของ API ยังมีการประมวลผลเนื้อหาโพสต์ภายหลังด้วย จึงสามารถใช้เนื้อหาที่ดัดแปลงเพื่อรันเส้นทางโค้ดเพิ่มเติมได้
- แคชนี้จะหายไปเมื่อคำขอจบลง และโพสต์ปลอมก็ไม่ได้มีอยู่จริงในฐานข้อมูล ดังนั้นการดัดแปลงแคชเพียงอย่างเดียวไม่พอให้คงอยู่ข้ามคำขอ
การสร้างแถวฐานข้อมูลด้วย oEmbed cache
- ฟีเจอร์ embeds ของ WordPress ใช้ไวยากรณ์
[embed]...[/embed]ในเนื้อหาโพสต์เพื่อฝังเนื้อหาระยะไกลที่รองรับ - เพื่อไม่ต้องส่งคำขอ HTTP ทุกครั้ง ผลลัพธ์จะถูก เก็บลงฐานข้อมูล เป็นโพสต์ชนิด
oembed_cacheในwp_posts - ถ้าฝังโพสต์ WordPress ภายในเครื่องด้วยเส้นทางสัมพัทธ์ ระบบจะข้ามคำขอ HTTP และไม่ตรวจว่า ID ของโพสต์ที่อ้างอิงมีอยู่จริงหรือไม่
- แม้จะฝังโพสต์ภายในเครื่องที่ไม่มีอยู่จริง เช่น
/?p=10ก็ยังอาจสร้างแถวoembed_cacheสำหรับข้อมูลนั้นได้ - เมื่อดึงแถวที่สร้างขึ้นกลับมาด้วย SQL injection อีกครั้ง พร้อมดัดแปลงชนิดโพสต์ในหน่วยความจำให้เป็น
postเป็นต้น การแสดงผลในฐานข้อมูลกับในแคชก็จะต่างกัน - WordPress จะปรับสองการแสดงผลนี้ให้สอดคล้องกันด้วยการเรียก
wp_update_post()และนอกจากฟิลด์IDกับpost_contentที่ระบุอย่างชัดเจนแล้ว จะให้ความสำคัญกับค่าหน่วยความจำที่ผู้โจมตีสร้างขึ้น - ด้วยเหตุนี้ จึงเปลี่ยนแถว
oembed_cacheให้เป็นโพสต์ปกติได้ แต่ในการเรียกนี้post_contentจะถูกเขียนทับด้วยผลลัพธ์จากการฝัง ทำให้ผู้โจมตีควบคุมเนื้อหาไม่ได้
สิทธิ์ผู้ดูแลชั่วคราวผ่าน customize_changeset
- ร่างการปรับแต่งธีมจะถูกเก็บเป็นโพสต์พิเศษชนิด
customize_changesetในwp_posts - ใน
post_contentจะเก็บ JSON ที่มีค่าการเปลี่ยนแปลงตามคีย์การตั้งค่า ชนิดของค่า และ ID ผู้ใช้ที่ทำการเปลี่ยนแปลง - เมื่อมีการใช้ changeset นั้น WordPress จะอ่าน
user_idของแต่ละรายการและสลับผู้ใช้ปัจจุบันชั่วคราวด้วยwp_set_current_user() - หากผู้โจมตีใช้ changeset ที่มี
user_id: 1ก็จะยืมตัวตนของผู้ดูแลได้ชั่วคราว แม้จะเป็นคำขอแบบไม่ระบุตัวตน - แต่เส้นทาง
wp_update_post()จากการปรับ oEmbed ก่อนหน้านี้จะเขียนทับpost_contentจึงต้องมีเส้นทางเรียกwp_update_post()อื่นที่รักษา JSON changeset อันตรายนี้ไว้
การคงเนื้อหาด้วยวงจรของโพสต์แม่
- โพสต์ใน WordPress มีโพสต์แม่ได้หนึ่งรายการ แต่จะไม่ยอมให้มี โครงสร้างวนซ้ำ เช่น ตั้งตัวเองหรือโพสต์ลูกเป็นโพสต์แม่
- ฟิลเตอร์
wp_insert_post_parentจะไล่ตามลำดับชั้นของโพสต์แม่เพื่อตรวจหาวงจร และถ้าพบก็จะเรียกwp_update_post()เพื่อเปลี่ยนpost_parentของโพสต์นั้นเป็น 0 - การเรียกครั้งที่สองนี้ระบุแค่
IDกับpost_parentโดยไม่เขียนทับpost_content - ถ้าด้วย SQL injection ทำให้โพสต์ในหน่วยความจำกลายเป็น
customize_changesetที่มีตัวเองเป็นโพสต์แม่ กระบวนการแก้วงจรนี้ก็จะเขียน JSON changeset อันตราย ที่ผู้โจมตีกำหนดลงฐานข้อมูล - เมื่อสร้าง changeset ที่มีวันที่อยู่ในอดีตแต่สถานะเป็น
futureWordPress ก็จะนำไปใช้ และทำการเปลี่ยนการตั้งค่าตามที่ระบุด้วยสิทธิ์ผู้ดูแลจากuser_id: 1 - สิทธิ์ผู้ดูแลจะคงอยู่เฉพาะระหว่างการประมวลผล changeset และจะกลับเป็นสิทธิ์ guest เมื่อเสร็จ
การรันคำขอทั้งหมดซ้ำผ่าน hook แบบไดนามิก
- Hook ของ WordPress แบ่งเป็น action และ filter เพื่อให้ปลั๊กอินเข้ามาแทรกในจุดต่าง ๆ ของวงจรชีวิต เช่น การล็อกอิน การโพสต์ หรือการลงทะเบียนสคริปต์
- เมื่อสถานะของโพสต์เปลี่ยน WordPress จะเรียก action แบบไดนามิกในรูป
"{$new_status}_{$post->post_type}"- สำหรับโพสต์ปกติ ชื่อจะเป็นอย่าง
publish_post - โพสต์ปลอมในหน่วยความจำสามารถกำหนดสถานะและชนิดได้ตามใจ จึงประกอบเป็นชื่อ action ที่ต้องการซึ่งมีขีดล่างหนึ่งตัวขึ้นไปได้
- สำหรับโพสต์ปกติ ชื่อจะเป็นอย่าง
- แม้อาร์กิวเมนต์ของ hook จะถูกจำกัดไว้ที่ ID ของโพสต์และอ็อบเจ็กต์
WP_Postที่ผู้โจมตีกำหนด จึงเรียกใช้ action ใด ๆ ให้เกิดประโยชน์โดยตรงได้ยาก - ห่วงโซ่การโจมตีนี้จึงดัดแปลงสถานะเป็น
parseและชนิดเป็นrequestเพื่อเรียก hookparse_request - เนื่องจาก
parse_requestเป็น hook ที่รันในช่วงต้นของวงจรคำขอ การเรียกมันซ้ำจึงทำให้คำขอ Batch เดิมทั้งก้อนถูกประมวลผลใหม่ตั้งแต่ต้น - การประมวลผลใหม่นี้เกิดขึ้นขณะตัวตนผู้ดูแลชั่วคราวจาก changeset ยังมีผลอยู่ ทำให้คำขอสำหรับผู้ดูแลที่ล้มเหลวเพราะสิทธิ์ไม่พอในการรันครั้งแรก กลับสำเร็จในการรันครั้งที่สอง
ห่วงโซ่ RCE ที่เสร็จสมบูรณ์ด้วยสองคำขอ
- เอ็กซ์พลอยต์สุดท้ายใช้คำขอ HTTP สองครั้ง และกำหนด ID ให้โพสต์ปลอมเป็นค่าที่สูงพอจะไม่ชนกับโพสต์จริง
-
คำขอแรก: เตรียมแถวถาวร
- ใช้ SQL injection ให้คืนโพสต์ปลอมที่มี local embed สามรายการ เพื่อสร้าง แถว
oembed_cache3 แถว ที่สอดคล้องกับO,C,D - embed ทั้งสามอ้างถึงโพสต์เดียวกันคือ
Sแต่ใช้ query string ต่างกันเพื่อให้ได้แฮช oEmbed cache แยกกัน
- ใช้ SQL injection ให้คืนโพสต์ปลอมที่มี local embed สามรายการ เพื่อสร้าง แถว
-
คำขอที่สอง: ประกอบโพสต์หกรายการ
- สร้างโพสต์ปลอม 6 รายการต่อไปนี้ในแคชหน่วยความจำ
O: แคชเก่าที่มีสถานะ/ชนิดเป็นpublish/oembed_cacheและมีโพสต์แม่คือCC: มีสถานะ/ชนิดเป็นfuture/customize_changesetมีตัวเองเป็นโพสต์แม่ และมี JSON changeset อันตรายP:draft/pageที่มีโพสต์แม่คือDD: มีสถานะ/ชนิดเป็นparse/requestและมีตัวเองเป็นโพสต์แม่S:publish/postที่ให้ข้อมูล embedT:publish/postที่บรรจุ embed ชั้นนอก- embed ของ
TจะไปดึงOและเพราะเวลาแก้ไขเก่า จึงทำให้แคชของSถูกรีเฟรช - ระหว่างรีเฟรช
Oหากตรวจพบวงจรของโพสต์แม่Cก็จะเปลี่ยนโพสต์แม่ของCเป็น 0 พร้อมเขียนcustomize_changesetและ JSON อันตรายในหน่วยความจำลงฐานข้อมูล - เมื่อ
futurechangeset ที่มีวันที่ในอดีตถูกนำไปใช้ ก็จะเผยแพร่Pด้วยตัวตนผู้ดูแลจากuser_id: 1 - การอัปเดต
Pจะพบวงจรของโพสต์แม่DจึงเขียนDลงฐานข้อมูลและเรียก actionparse_requestจากสถานะและชนิดที่ถูกดัดแปลง - คำขอ Batch มี คำขอสร้างผู้ดูแลใหม่ รวมอยู่ตั้งแต่ต้น
- ในการประมวลผลครั้งแรก คำขอนี้ล้มเหลวเพราะยังเป็นสิทธิ์ guest
- แต่เมื่อถูกรันซ้ำผ่าน
parse_requestขณะยังมีสิทธิ์ผู้ดูแลชั่วคราวอยู่ ก็จะสำเร็จ - หลังล็อกอินด้วยบัญชีผู้ดูแลใหม่แล้ว การอัปโหลด ZIP ของปลั๊กอินแบ็กดอร์จะนำไปสู่การรันโค้ดจากระยะไกลในที่สุด
บทบาทที่เปลี่ยนไปในงานวิจัยความปลอดภัยด้วย AI
- ขั้นตอนที่สร้างสรรค์เป็นพิเศษในห่วงโซ่นี้ ได้แก่ การข้ามข้อจำกัด GET ด้วยคำขอ Batch แบบเรียกซ้อน การรวมแคชกับ changeset เพื่อได้สิทธิ์ผู้ดูแล และการเรียก
parse_requestด้วยโพสต์ปลอมเพื่อรันคำขอซ้ำทั้งชุด - แม้จะยังสรุปความเหนือกว่าโดยทั่วไปไม่ได้ แต่ก็ประเมินว่า หากไม่มี AI นักวิจัยความปลอดภัยคง ไม่สามารถค้นพบและต่อห่วงโซ่นี้จนเสร็จภายใน 10 ชั่วโมงได้
- ต่อให้บอกบั๊ก Batch เดิมไว้ล่วงหน้า ก็ยังไม่มั่นใจว่าจะต่อไปถึง RCE ได้ทันในเวลานั้น
- ผู้เขียนมองว่า GPT5.6 Sol Ultra พัฒนาขึ้นมากจาก GPT5.5 ในความสามารถในการค้นหา code gadget หลายจุดที่กระจัดกระจายและเชื่อมเป็นห่วงโซ่เดียว
- ยิ่งโมเดลรับหน้าที่พัฒนา technical exploit มากขึ้น มนุษย์ก็จะยิ่งไปโฟกัสกับการเลือกผลิตภัณฑ์ พื้นผิวการโจมตี เวลา投入 และทิศทางการวิจัย รวมถึงการแก้ทิศเมื่อโมเดลหลงทาง
- ความสามารถด้าน meta-research แบบนี้ AI ยังทำได้ไม่ดี และคาดว่าจะยิ่งสำคัญมากขึ้นเมื่อความสามารถทางเทคนิคของโมเดลสูงขึ้น
1 ความคิดเห็น
ความเห็นจาก Hacker News
ไม่มีหลักฐานว่าเอ็กซ์พลอยต์แบบนี้เคยได้รับหรือจะได้รับ 500,000 ดอลลาร์ ผู้เขียนบอกว่าปรับพรอมป์ตอย่างระมัดระวังราวกับคัมภีร์ ดังนั้นน่าจะขายพรอมป์ตนั้นในราคา 500,000 ดอลลาร์ไปเลยมากกว่า
ผู้เขียนทำงานที่ https://www.assetnote.io/ ซึ่งขายผลิตภัณฑ์ AI สำหรับสแกนอัตโนมัติ
นายหน้าพวกนี้มักไม่จ่ายเงินก้อนใหญ่ทั้งหมดในครั้งเดียว แต่จะขายสิทธิ์การเข้าถึงให้ผู้กระทำการระดับรัฐ แล้วทยอยจ่ายตราบใดที่บั๊กยังไม่ถูกแพตช์ โครงสร้างแบบนี้มีไว้เพื่อกันการขายต่อหรือการใช้จนหมดเร็ว จึงแทบไม่มีใครยืนยันได้ว่าเคยมีคนได้รับเงินเต็มจำนวนจริงสำหรับช่องโหว่ลักษณะใกล้เคียงกัน
ตัวอย่างที่ใกล้สุดคือวัยรุ่นจากฟลอริดาที่ฝังมัลแวร์ในเกมบน Steam เพื่อขโมยบัญชีแล้วโดนจับ พวกเขาคงโดนจับอยู่ดี แต่ถ้าไม่เอาไปอวดบนโซเชียล การสืบสวนก็น่าจะใช้เวลานานกว่านี้มาก
ดูจาก https://github.com/WordPress/WordPress/commit/3a640e1c5e39aa... ก็ยังมี SQL injection จากการต่อสตริง โผล่มาในปี 2026
เขาบอกให้ใช้
dbDeltaแทนการรัน SQL ตรง ๆ แต่กลับบังคับกฎรูปแบบที่จุกจิกสุดขีด เช่น ต้องขึ้นบรรทัดใหม่ทุกฟิลด์ ต้องเว้นวรรคสองช่องระหว่างPRIMARY KEYและต้องใช้KEYแทนINDEXห้ามใส่เครื่องหมายคำพูดหรือแบ็กทิกกับชื่อฟิลด์ ชนิดข้อมูลต้องเป็นตัวพิมพ์เล็ก คีย์เวิร์ด SQL ต้องเป็นตัวพิมพ์ใหญ่ และพารามิเตอร์ความยาวก็ต้องระบุทั้งหมดsprintfอยู่จริงหรือในคำขอ
POSTและGETมีเพย์โหลดลักษณะ/wp/v2/widgets?author_exclude=1%29+AND+1%3D0+UNION+ALL+SELECT...Principal Software Engineer @ Bluehost,WordPress Core Committerแต่พอเห็นโค้ดแบบนี้ คำว่า ‘principal’ ก็ฟังดูประหลาดดีเริ่มเบื่อ การเขียนแบบ FOMO แล้ว สิ่งที่ค้นพบไม่ได้มาจากเงิน 25 ดอลลาร์อย่างเดียว แต่มาจากความรู้เฉพาะทางในอุตสาหกรรมว่าควรมองตรงไหนและสำรวจอย่างไร รวมถึงข้อมูลที่สะสมมาหลายปี
ควรเลิกขายเรื่องเล่าแบบการพนันและภาพลวงว่าทุกคนกำลังพลาดโอกาสกันได้แล้ว
ส่วนที่น่าทึ่งคือราคาสูงของช่องโหว่ที่รู้กันอยู่แล้ว ซึ่งก็อาจไม่จริงด้วยซ้ำ WordPress มักถูกเรียกว่า remote root shell ที่แถมฟังก์ชันบล็อกมาด้วย
เข้าใจได้ว่าการบอกให้ผู้ใช้ทั่วไปลากแล้ววางย่อมง่ายกว่าการให้ไปคอมมิตลง GitHub repository แล้ว build ด้วย Hugo แต่ในมุมความปลอดภัย มันคือโครงสร้างที่รอวันให้โค้ดแกนกลางหรือปลั๊กอินนับพันตัวตัวใดตัวหนึ่งมีช่องโหว่ แล้วเปิด remote code execution แบบ as-a-service
เป็นบทความที่น่าสนใจ และ การค้นหาเอ็กซ์พลอยต์ด้วย LLM และการเปิดเผยต่อสาธารณะ เป็นเรื่องที่ควรกังวลจริง ๆ ผมเองก็เคยทำให้โมเดลสร้างโค้ดหนีออกจากคอนเทนเนอร์จากช่องโหว่ยกระดับสิทธิ์เฉพาะเครื่องบน Linux ได้ค่อนข้างเร็ว
แต่สิ่งที่น่าแปลกคือ GPT-5.6 ไม่ได้บล็อกพรอมป์ตด้วยมาตรการความปลอดภัย GPT-5.5 ขึ้นไปมักไม่ค่อยยอมทำงานด้าน offensive security คล้าย Opus 4.7+/Fable ดังนั้นจึงดูเป็นไปได้ว่าผู้เขียนอาจได้รับการอนุมัติด้านความปลอดภัยไซเบอร์จาก OpenAI เพื่อผ่อนคลายมาตรการป้องกัน
แม้แต่เครื่องมือ Static Application Security Testing (SAST) แบบไม่ใช้ AI ก่อนปี 2020 ก็จับ SQL injection แบบนี้ได้บ่อย และอย่างน้อยก็ควรเจอในการรีวิวโค้ด จึงน่าสงสัยว่า WordPress ไม่ใช้การรีวิวโค้ดหรือ SAST หรือไม่
เว็บไซต์หนึ่งของฉันถูกแฮ็กด้วยช่องโหว่นี้ แต่โชคดีที่เป็นที่ที่ไม่มีผู้ใช้
ผู้โจมตีสร้างบัญชีแอดมินสองบัญชีในฐานข้อมูล และติดตั้งเว็บเชลล์รันคำสั่งระยะไกล
wp-core-[อักขระสุ่ม 12 ตัว].phpไว้ที่wp-content/plugins/wp-coreในmu-pluginsยังมีแบ็กดอร์firewall.phpที่สร้างแอดมินผ่านGET ?sergeiและเพิ่มแบ็กดอร์cache-seo-helper.phpด้วย รวมทั้งใช้fixer.phpเปลี่ยนหมายเลขเวอร์ชัน WordPress ให้ดูเหมือนเป็นเวอร์ชันที่แพตช์แล้ว สุดท้ายจึงตัดสินใจ เลิกใช้ WordPressช่วงท้ายบทความเริ่มเรียกโพสต์ด้วยชื่อแปลก ๆ จนเข้าใจยาก มี ID หนึ่งเป็น
Oอีกอันเป็น0และสงสัยว่าทำไมถึงใช้ตัวอักษรเดี่ยวกับOCPDSTที่ดูเหมือนสุ่ม แทนEMBED_01หรือABCDEFOคือpublish/oembed_cache,Cคือfuture/customize_changeset,Pคือdraft/page,Dคือparse/request,Sคือpublish/postที่ให้ข้อมูล embed และTคือpublish/postที่มี external embedสงสัยว่านี่กำลังสมมติว่าคนที่ยอมจ่าย 500,000 ดอลลาร์ ไม่มีความสามารถพอจะ ใช้ GPT-5.6 โดยตรง หรือไม่
ฉันเองก็ใช้ LLM หาช่องโหว่ด้านความปลอดภัย แต่ไม่สามารถส่งผลลัพธ์ที่ได้ตรง ๆ แล้วจบได้ และก็มีคนมากมายที่พยายามทำแบบนั้น
คำถามว่า GPT-5.6 Sol เป็นเหนือมนุษย์หรือไม่ ไม่ใช่คำถามที่ตอบได้แค่ใช่หรือไม่ใช่ คอมพิวเตอร์เหนือกว่ามนุษย์ในหมากรุกมาตั้งแต่หลายสิบปีก่อน และจากบทความนี้ก็ดูเหมือนว่าตอนนี้อาจเหนือกว่ามนุษย์ในด้านการเข้าใจโค้ดแล้ว