สายพานซองคำขอสีเขียวเข้มผ่านถาดตรวจ โดยซองหนึ่งถูกแยกด้วยสลักสีอำพันเพียงจุดเดียว

xAI เพิ่ม safety_identifier: แยกผู้ใช้ที่ทำผิดนโยบายโดยไม่ส่งตัวตนตรง ๆ

พี่โชว์Engineering

xAI เพิ่มฟิลด์ safety_identifier ใน Chat Completions, Responses API, deferred chat completions, Batch API และ gRPC เมื่อ 25 กันยายน 2026 จุดประสงค์คือให้ผู้ให้บริการผูกเหตุละเมิดนโยบายกับผู้ใช้ปลายทางรายเดิม แทนการมองเห็นเพียง API key ของทั้งแอปครับ ฟีเจอร์นี้มีประโยชน์กับ abuse response แต่ถ้าส่งอีเมลหรือเลขลูกค้าตรง ๆ ก็เปลี่ยนเครื่องมือป้องกันให้กลายเป็นช่องส่งข้อมูลส่วนบุคคลได้

ผมเทียบ release notes ของ xAI, Security FAQ, แนวทาง safety identifier ของ OpenAI และ threat model เรื่อง prompt injection ของ OWASP หลักฐานตรงกันว่าการแยกผู้ใช้ปลายทางช่วย attribution แต่ไม่มีแหล่งใดบอกว่าฟิลด์เดียวหยุดการโจมตีทุกชนิดได้

สรุป 30 วินาที

  • safety_identifier เป็น opaque identifier หรือรหัสที่ provider ไม่ควรต้องแปลกลับเป็นตัวตนจริง แอปส่งค่าเดิมสำหรับผู้ใช้รายเดิมเพื่อให้เหตุผิดนโยบายถูกรวมอย่างแม่นยำกว่า API key รวม
  • อย่าส่ง email, phone, username หรือ database ID ตรง ๆ วิธีที่ปลอดภัยกว่าคือ keyed hash/HMAC ด้วย secret แยกตาม environment และมีแผน rotate
  • ค่าเดิมควรผูกกับ principal ที่ผ่านการยืนยันตัวตน ไม่ใช่ session cookie ดิบหรือ IP address ซึ่งเปลี่ยนง่ายและอาจรวมคนหลายคน
  • ฟิลด์นี้ช่วย provider-side abuse attribution แต่ไม่แทน authorization, rate limit, tenant isolation, content filter, tool approval, audit log หรือ incident response ของแอป
  • prompt injection ยังทำให้โมเดลพยายามใช้ tool เกินเจตนาได้ แม้ request มี identifier ถูกต้อง ต้องจำกัด filesystem, network และ side effect แยก
  • migration จากฟิลด์ user เดิมต้องตรวจ retention, privacy notice และ log redaction ไม่ควรเปลี่ยนชื่อ field แล้วถือว่าความเป็นส่วนตัวเรียบร้อย

ทำไมเกี่ยวกับคุณ

แอปหลายผู้ใช้เรียกโมเดลผ่าน API key เดียว เปรียบเหมือนอาคารสำนักงานที่ทุกคนใช้บัตรผ่านของบริษัท หากมีคนหนึ่งพยายามขอเนื้อหาต้องห้าม ผู้ให้บริการเห็นเพียงชื่อบริษัทและอาจลดสิทธิ์ทั้ง key การมีรหัสปลายทางเหมือนติดเลขตู้รับเอกสารที่ไม่บอกชื่อเจ้าของ ช่วยแยก pattern รายคนโดยไม่ต้องส่งบัตรประชาชน

ทีม product ได้ประโยชน์เพราะลด collateral damage จากการจัดการ abuse ทีม security ได้ signal เพิ่มเพื่อเชื่อมเหตุซ้ำ และทีม privacy ได้โอกาสออกแบบ pseudonymization ตั้งแต่ boundary แต่ทุกฝ่ายต้องตกลงว่าใครสร้างค่า เก็บ secret ที่ไหน และเมื่อบัญชีถูกลบจะจัดการ mapping อย่างไร

ทำงานยังไง: เลขตู้ฝากของแทนชื่อจริง

วิธีพื้นฐานคือสร้างค่า HMAC-SHA256(environment_secret, internal_user_id) แล้ว encode เป็นสตริงคงที่ HMAC ต่างจาก hash ธรรมดาตรงที่ผู้ไม่มี secret เดาค่า internal ID จาก dictionary ได้ยากกว่า การแยก secret ระหว่าง production กับ staging ป้องกันการเชื่อมตัวตนข้าม environment โดยไม่จำเป็น

ค่าควร stable พอให้ตรวจเหตุซ้ำ แต่ไม่ stable จนกลายเป็น tracking identifier ข้ามผลิตภัณฑ์ทั้งหมด หากหลายบริการจำเป็นต้องแชร์ abuse signal ให้เขียน purpose, retention และ access control ตรง ๆ ไม่ใช่ใช้ secret เดียวเพราะสะดวก การ rotate secret จะทำให้ continuity ขาด จึงควรบันทึก version ของ derivation ภายในโดยไม่ส่ง raw identity

ระบบต้องตรวจ authenticated principal ก่อนสร้างรหัส หากรับ user_id จาก body ที่ client ส่งเอง ผู้โจมตีเปลี่ยนค่าเพื่อโยนความผิดให้คนอื่นได้ และหากบัญชีหนึ่งถูกยึด identifier เดิมก็ยังชี้ไปบัญชีถูกต้องแต่ไม่ชี้ว่า actor เปลี่ยน ต้องมี session risk, MFA, device และ behavioral signal ประกอบ

เงินและผลกระทบ

ประโยชน์เชิงต้นทุนคือทีม support แยกเคสผู้ใช้รายเดียวออกจาก outage ของทั้ง tenant ได้ดีขึ้น และ rate-limit เฉพาะ principal แทนปิด API key รวม แต่การเพิ่ม field ทุก request สร้าง data flow ใหม่ ต้องทำ DPIA/ROPA ตามบริบทองค์กร อัปเดต privacy notice และกำหนด deletion/retention กับ vendor

อย่าวัดความสำเร็จด้วยจำนวน account ที่ถูกบล็อกอย่างเดียว เก็บ false positive, repeat abuse, appeal success, time-to-containment และผลกระทบต่อผู้ใช้บริสุทธิ์ การบล็อกเร็วแต่ผิดคนทำให้ต้นทุน support และความเชื่อถือสูงขึ้น

สิ่งที่ยังไม่ชัดและแหล่งข่าวพูดไม่ตรงกัน

xAI ระบุช่องทาง API ที่รองรับและเป้าหมาย attribution แต่ release note ไม่ระบุ retention, cardinality limit, วิธีใช้ signal ในการบังคับนโยบาย หรือสิทธิ์อุทธรณ์ของผู้ใช้ รายละเอียดเหล่านี้ต้องถามในสัญญา enterprise หรือเอกสาร privacy ล่าสุด

OpenAI แนะนำ safety identifier ใน ecosystem ของตน ซึ่งช่วยเป็น pattern อ้างอิง แต่ไม่ได้รับรองว่าการตีความของ xAI เหมือนกันทุกจุด เราใช้หลักการ HMAC และการไม่ส่ง PII เป็น design comparison ไม่ใช่หลักฐาน implementation ภายในของ xAI

OWASP อธิบาย prompt injection ที่ข้ามจากข้อมูลเข้าไปสู่ tool action ฟิลด์ attribution ไม่ได้ลด capability ของ tool จึงยังเหลือ risk คนละชั้น และ provider อาจเห็น request abuse ช้ากว่าที่แอปเห็น side effect จริง

ควรทำอะไร

เริ่มจาก data-flow diagram: internal principal → keyed pseudonym → API request → vendor log ระบุ owner, retention และ deletion ทุกจุด สร้าง identifier ฝั่ง server หลัง auth, ใช้ secret manager, แยก environment และห้าม raw ID ลง application log จากนั้นทดสอบ account merge, delete, compromised session, shared device และ retry/batch ว่าค่าไม่สลับคน

วาง control ชั้นอื่นต่อ: rate limit ต่อ account/tenant, moderation ตาม use case, output validation, tool allowlist, human approval สำหรับผลย้อนกลับยาก และ audit trail ที่ redact secret หาก provider แจ้ง abuse ต้อง map กลับภายในผ่านกระบวนการจำกัดสิทธิ์ ไม่แจก mapping ให้ทีมกว้าง

ก่อนเปิดใช้จริง ให้ซ้อมเหตุการณ์สามแบบแยกกันครับ แบบแรกคือผู้ใช้คนเดิมส่งคำขอผิดนโยบายซ้ำ ระบบควรรวมเหตุได้โดยไม่เผย raw ID แบบที่สองคือผู้ใช้สองคนอยู่ tenant เดียวกัน คนหนึ่งผิดกฎแต่อีกคนยังใช้งานได้ และแบบที่สามคือบัญชีถูกยึด ทีมต้องแยกการตอบสนองต่อ account abuse ออกจาก credential compromise ให้ได้ การซ้อมนี้ช่วยยืนยันว่า identifier เป็นเพียงกุญแจเชื่อม log ไม่ใช่คำตัดสินอัตโนมัติ

แบ่งหน้าที่ให้ชัดด้วย: ทีม application เป็นเจ้าของการสร้างค่าและ schema ทีม security เป็นเจ้าของ threshold กับการสอบสวน ทีม privacy อนุมัติ purpose/retention และทีม support มี playbook อุทธรณ์โดยไม่เห็น secret เต็ม หาก vendor ส่งเพียงรหัสกลับมา ให้ระบบค้น mapping ผ่าน service account เฉพาะงานพร้อมบันทึก audit ทุกครั้ง ห้ามให้คนคัดลอกตาราง mapping ไปใส่ spreadsheet เพราะจะเปลี่ยน pseudonym ให้กลับเป็นรายชื่อเงาที่ควบคุมยาก

สำหรับ rollout เริ่มจาก shadow mode ที่ส่ง identifier แต่ยังไม่ใช้ตัดสินใจในแอป เปรียบเทียบเหตุที่ vendor แจ้งกับสัญญาณภายใน ตรวจ collision, missing principal, cardinality พุ่ง และค่าเดียวโผล่ข้าม environment เมื่อข้อมูลนิ่งจึงค่อยใช้ประกอบ rate limit หรือ review queue โดยกำหนด expiry ของการลงโทษและช่องทางอุทธรณ์ไว้ก่อน ไม่ควรเปิด auto-ban แล้วค่อยคิดวิธีกู้บัญชีภายหลัง

Recap

  • สร้าง opaque identifier ด้วย keyed pseudonymization ไม่ส่ง PII ตรง ๆ
  • ผูกค่ากับ principal หลัง authentication และแยก environment
  • กำหนด retention, deletion, appeal และ secret rotation
  • ไม่ใช้ identifier แทน authorization, rate limit หรือ tool sandbox
  • ทดสอบ account takeover, merge/delete และ batch/retry
  • เฝ้า false positive กับ collateral damage ไม่ดูแค่จำนวนบล็อก

safety_identifier เป็น breadcrumb ที่ดีครับ แต่ breadcrumb ไม่ใช่รั้ว ถ้าระบบส่งรหัสที่ออกแบบดีและยังจำกัดสิทธิ์ทุก tool เหตุผิดปกติจะตามรอยง่ายขึ้นโดยไม่ต้องเอาตัวตนจริงไปวางบนสายพานทุก request