สวัสดีผู้อ่านทุกท่านครับ หลาย ๆ คนอาจจะเคยได้ยินคำว่า Injection จากการโจมตีรูปแบบต่าง ๆ เช่น SQL injection หรือ Command Injection กันมาบ้างแล้ว วันนี้ผมจะพาไปทำความรู้จักกับอีกหนึ่ง Injection นั่นก็คือ Prompt Injection ครับ ซึ่งจุดเริ่มต้นของเรื่องนั้นมาจากการที่ผมนั่งไถ X (Twitter) อ่านข่าว ระหว่างทานข้าวแล้วก็ได้เจอหัวข้อที่น่าสนใจที่พูดถึงเรื่อง Prompt Injection จึงเกิดความสงสัยว่ามันคืออะไร ผมจึงได้ไปหาข้อมูลเพิ่มเติม แล้วนำมาสรุปเป็นบทความให้เพื่อน ๆ ที่สนใจได้อ่านกันครับ และเพื่อไม่เป็นการเสียเวลาจะขอเริ่มเลยนะครับ
โดยผมจะลองแบ่งหัวข้อย่อย ๆ ออกเป็น ดังนี้
- What is Prompt Injection?
- Types of Prompt injection attacks
- How to prevent Prompt injection attacks
- Conclusion
What is Prompt Injection
ก่อนที่จะไปรู้ว่า Prompt Injection คืออะไร เรามาเริ่มด้วยการพูดถึง LLM (Large Language Model) กันก่อนครับ
สำหรับนิยามของ LLM (Large Language Model) หรือ LLM ก็คือ โมเดลภาษาขนาดใหญ่ ซึ่งเป็นโมเดลพื้นฐานที่ใช้ประมวลผลข้อมูลต่าง ๆ และสร้างข้อมูลใหม่ ๆ ออกมา ซึ่งส่วนใหญ่จะเป็นโมเดลพื้นฐานของ Generative AI โดย LLM นั้นจะถูกสร้างขึ้นผ่านการจำลองสมองการเรียนรู้ของมนุษย์ (Deep Learning) ทำให้มีความสามารถในการเรียนรู้เข้าใจภาษาของมนุษย์ และสามารถ ‘คาดเดา’ หรือ สร้างคำ ภาษาได้เหมือนมนุษย์จริง ๆ
ในปัจจุบันมี LLM ที่มีชื่อเสียงมากมาย และเป็นที่นิยม เช่น ChatGPT, Bard, Gemini ฯลฯ ซึ่งได้มีการนำมาใช้ในบริบททางธุรกิจมากขึ้นในปัจจุบัน ไม่ว่าจะเป็น การพัฒนา Customer Experience ด้วย Chatbot โดยใช้พื้นฐานของ LLM ซึ่งทำให้การโต้ตอบกับลูกค้าเป็นไปอย่างธรรมชาติ และช่วยแก้ปัญหาเบื้องต้นให้กับลูกค้า และผู้ใช้บริการได้เป็นอย่างดี (ขอบคุณนิยามจาก https://www.disruptignite.com/blog/llm-large-language-models )
แล้ว Prompt Injection คืออะไร ผมได้ไปถามเจ้าตัวมาให้แล้วครับ
เพื่อความเข้าใจง่าย ๆ ผมจะขอเรียกเจ้าพวก ChatGPT, Bard, Gemini ฯลฯ เหล่านี้ว่า LLM นะครับ ซึ่ง Prompt Injection ก็คือ การที่เราสามารถป้อนคำสั่ง (Prompt) เข้าไปเพื่อหลอก (Trick) ให้พวก LLM ตอบกลับด้วยข้อมูลที่เป็นอันตรายหรืออยู่นอกเหนือจากสิ่งที่ผู้พัฒนา (Developer) กำหนดไว้ ซึ่งปกติมันก็จะมีสิ่งที่เรียกว่า “guardrails” ที่ทางผู้พัฒนาได้ออกแบบไว้ อาจจะเป็น code/instruction ต่าง ๆ ที่คอยป้องกันและทำให้แน่ใจว่า สิ่งที่ LLM ตอบกลับไปยังผู้ใช้งาน (User) จะมีความถูกต้อง เหมาะสมและปลอดภัย
ยกตัวอย่าง เช่น เราไปถาม LLM ว่า เราจะ Hack Facebook ของคนอื่นได้ยังไง
แน่นอนว่ามันก็จะไม่ตอบนะครับ ว่าเราจะไป Hack ได้ยังไง ซึ่งก็ถือว่าเป็นเรื่องดี แต่อย่างไรก็ตามก็จะมีวิธีที่เราสามารถ “Bypass” การป้องกันเหล่านี้ได้อยู่ดี เพื่อที่จะเอาข้อมูลที่เราต้องการออกมาให้ได้ ซึ่งขั้นตอนนี้อาจจะเรียกได้อีกแบบนึงว่าเป็นการ “Jailbreak”
Types of Prompt Injection Attacks
ต่อไปเป็นเรื่องรูปแบบของการโจมตีนะครับ ซึ่งจะแบ่งออกเป็น 2 ประเภท หลัก ๆ ก็คือ
1. Direct Prompt Injection
2. Indirect Prompt Injection
1. Direct Prompt Injection
Direct Prompt Injection หรือการโจมตีไปที่ LLM โดยตรง ยกตัวอย่าง เช่น การที่ผู้ไม่ประสงค์ดีพยายามป้อนข้อมูล (Input) เข้าไปยัง LLM เพื่อควบคุมพฤติกรรม (Behavior) หรือการทำงานต่าง ๆ ของ LLM ให้เป็นไปอย่างไม่เหมาะสม
อธิบายจากรูปภาพ จะเห็นว่าในขั้นตอนแรก ผู้ไม่ประสงค์ดีถาม LLM ว่า ขอวิธีในการสร้างระเบิดได้ไหม ซึ่งตัว LLM ก็จะไม่ตอบคำถามที่เป็นอันตราย แต่หากเปลี่ยนวิธีในการถามคำถาม ก็จะสามารถดึงเอาคำตอบจาก LLM ได้ ซึ่งก็จะมีหลายเทคนิคในการทำสิ่งนี้ เช่น Role Play (สมมติบทเป็นอาจารย์-นักเรียน เพื่อหลอกให้ LLM ตอบคำถาม หรือ Payload Splitting (ค่อยๆหลอกถามทีละส่วน จนได้ผลลัพธ์ ที่ต้องการ ) เป็นต้น
2. Indirect Prompt Injection
Indirect Prompt Injection หรือการโจมตีไปที่ LLM ทางอ้อม หรือก็คือ การที่ผู้ไม่ประสงค์ดีพยายามจะนำข้อมูลอันตราย เช่น Code Comment, API Response, Attacker Email ไปใส่ไว้ใน Resource ที่ LLM ดึงข้อมูลมาใช้ในเรียนรู้ (Train Model) เพื่อเป็นการบังคับ (Control) ตัว LLM ให้ตอบกลับผู้ใช้ด้วยสิ่งที่ผู้ไม่ประสงค์ดีต้องการ
อธิบายจากรูป จะเห็นว่าผู้ใช้งาน (User) ได้ถาม LLM เกี่ยวกับหัวข้อ XYZ และ LLM กลับด้วยข้อมูลบางส่วนที่มาจากผู้ไม่ประสงค์ดี จึงทำให้สิ่งนี้เป็นอันตรายต่อผู้ใช้งาน
How to Prevent Prompt Injection Attacks
สำหรับวิธีป้องกันในกรณีที่เราจำเป็นต้องเอา LLM มาใช้งานกับระบบของเรา ก็จะมีวิธีช่วยป้องกัน Prompt injection attacksได้หลายวิธี ยกตัวอย่าง เช่น
1. Validating Inputs
คือ การตรวจสอบสิ่งที่ผู้ใช้งาน (User) ป้อนเข้ามา ว่ามีความเหมาะสมหรือไม่ ทำการกำจัดข้อมูลที่อาจจะเป็นอันตรายก่อนนำเข้าสู่ระบบ
2. Output Filtering
คือ การตรวจสอบผลลัพธ์ที่ได้จาก LLM เพื่อกำจัดข้อมูลอันตรายออก ก่อนนำมาใช้งาน เช่น อาจจะมีการใช้ Blacklist, Whitelist filtering เพื่อใช้ในตรวจสอบผลลัพธ์
และยังมีอีกหลายวิธีที่ช่วยป้องกันได้ สามารถเข้าไปอ่านเพิ่มเติมได้ที่นี่เลยครับ https://www.ibm.com/blog/prevent-prompt-injection/
Conclusion
สรุปสั้น ๆ สำหรับ Prompt Injection ก็คือ การที่ผู้ไม่ประสงค์ดีสามารถส่งชุดคำสั่ง (Prompt) เพื่อใช้ควบคุม LLM ให้ตอบกลับด้วยข้อมูลที่เป็นอันตรายหรืออยู่นอกเหนือจากสิ่งที่ผู้พัฒนา (Developer) กำหนดไว้ อีกทั้งยังสามารถใส่ข้อมูลอันตรายเข้าไป เพื่อให้ส่งผลกระทบกับผู้ใช้รายอื่น ๆ ได้ด้วย
ซึ่งในปัจจุบันเราก็ใช้งานตัว LLM เหล่านี้กันอย่างแพร่หลาย (อย่างน้อยก็ผมคนนึงแหละที่ใช้ ChatGPT ทุกวัน ฮ่าๆๆๆ) เราจึงควรตรวจสอบข้อมูลที่เราได้รับว่ามีความถูกต้องเหมาะสมหรือไม่ ก่อนที่จะนำไปใช้งานต่อ เพราะอาจจะมีของแถมที่มีอันตรายมาด้วยก็เป็นได้
สำหรับบทความในครั้งนี้ก็มีเพียงเท่านี้ครับ ทั้งนี้ส่วนตัวแล้วผมนั้นอาจจะยังไม่ได้เข้าใจเรื่อง AI อย่างลึกซึ้ง หากใช้คำพูดผิด หรือมีข้อผิดพลาดประการใด ก็ขออภัยมา ณ ที่นี้ด้วย ไว้เจอกันใหม่ในบทความหน้าครับ สวัสดีครับ
Reference:
- https://www.linkedin.com/pulse/tackling-llm-vulnerabilities-indirect-prompt-injection-ashish-bhatia-evzje/
- https://www.arthur.ai/blog/from-jailbreaks-to-gibberish-understanding-the-different-types-of-prompt-injections#:~:text=We%20can%20first%20classify%20a,prompt%20injection%20to%20an%20LLM.
- https://www.ibm.com/topics/prompt-injection