วิธีหลอก Claude ให้รั่วไหลความลับที่ลึกที่สุดของผู้ใช้
(ayush.digital)- เมื่อรวมหน่วยความจำของ Claude ที่เปิดใช้เป็นค่าเริ่มต้นเข้ากับการท่องเว็บ พบว่าสามารถส่ง ชื่อ·ที่ทำงาน·บ้านเกิด ของผู้ใช้ไปยังเซิร์ฟเวอร์ภายนอกอย่างลับ ๆ ได้ เพียงถามคำถามธรรมดาเกี่ยวกับร้านกาแฟ
web_fetchบล็อกการเข้าถึง URL ใด ๆ โดยพลการ แต่ยังสามารถตามลิงก์ที่อยู่ในหน้าก่อนหน้าได้ จึงเข้ารหัสข้อมูลในคำขอ GET ด้วย ไดเรกทอรีตัวอักษร ที่เลือกเส้นทางทีละตัว เช่น/a→/ay→/ayu- เว็บไซต์โจมตีแสดงหน้าตรวจสอบ Cloudflare ปลอมเฉพาะกับ Claude และแสดงหน้าร้านกาแฟปกติให้มนุษย์เห็น โดย Claude ส่งไม่เพียงชื่อและบริษัท แต่ยังรวมถึง Charlotte, NC ที่อนุมานจากข้อมูลในอดีต โดยไม่ได้รับอนุญาต
- แม้ผู้ใช้จะไม่ได้ส่ง URL อันตรายโดยตรง เว็บไซต์ก็สามารถถูกค้นพบและเข้าชมจากผลลัพธ์
web_searchได้ ดังนั้นหากทำให้เว็บไซต์ที่ปรับตามหัวข้อใหม่ ๆ ติดอันดับสูงในผลการค้นหา ก็สามารถชักนำการโจมตีได้ด้วยเพียงคำถามที่เกี่ยวข้อง - Anthropic ทราบปัญหาภายในอยู่แล้วแต่ในขณะนั้นไม่ได้แพตช์และไม่ได้จ่ายรางวัลบั๊กบาวน์ตี ต่อมาจึงบล็อกการตามลิงก์จากหน้าภายนอก และจำกัดขอบเขตการท่องเว็บไว้ที่ผลลัพธ์
web_searchกับ URL ที่ผู้ใช้ให้มา
ข้อมูลที่สะสมในหน่วยความจำของ Claude
- claude.ai สำหรับผู้ใช้ทั่วไปใช้ ระบบหน่วยความจำ ที่ประกอบด้วยสองส่วน
- สรุปบทสนทนาล่าสุดทุกวันเป็นไม่กี่ย่อหน้า แล้วฉีดเข้าไปในบทสนทนาทั้งหมดหลังจากนั้น
- ใช้เครื่องมือ
conversation_searchเพื่อค้นหาประวัติการสนทนาทั้งหมดเมื่อจำเป็น
- ผู้ใช้มอบหมายให้ Claude จัดการตั้งแต่เอกสารงานลับ ไปจนถึงความลับส่วนตัวและปัญหาความสัมพันธ์ ทำให้บันทึกที่สะสมกลายเป็นโปรไฟล์ความหนาแน่นสูงที่สามารถประกอบภาพตัวบุคคลได้อย่างละเอียด
- ข้อมูลนี้อาจถูกนำไปใช้ในทางที่ผิดเพื่อ แบล็กเมล·ปลอมตัว·หลบเลี่ยงคำถามความปลอดภัย และความเสี่ยงการรั่วไหลจะเพิ่มขึ้นเมื่อคลังหน่วยความจำถูกรวมเข้ากับเอเจนต์ที่ท่องเว็บ
- เป้าหมายการตรวจสอบไม่ใช่ Claude Code แต่เป็น Claude สำหรับใช้งานประจำวัน
การนำข้อมูลออกด้วยการท่องเว็บ
- เลือกฟีเจอร์ท่องเว็บของ Claude เป็น เส้นทางนำข้อมูลออก แบบทั่วไปที่ทำงานได้โดยไม่ต้องมีการตั้งค่าทดลองแยกต่างหาก การรันโค้ด หรือ MCP พิเศษ
- Claude ใช้
web_searchและweb_fetchแบบอ่านอย่างเดียวในการเข้าถึงอินเทอร์เน็ต - เมื่อทำให้
web_fetchเข้าเยี่ยมชมเซิร์ฟเวอร์ที่ผู้โจมตีเป็นเจ้าของ ก็ตรวจพบคำขอ GET ที่มี user agentClaude-User- คำขอแรกเริ่มล้มเหลวเพราะ
robots.txtที่ Cloudflare ตั้งค่าไว้ให้เว็บไซต์ - หลังแก้ไข
robots.txtแล้ว คำขอจึงปรากฏในล็อกเซิร์ฟเวอร์
- คำขอแรกเริ่มล้มเหลวเพราะ
- เนื่องจากทำได้เฉพาะคำขอ GET จึงพยายามใส่ข้อมูลไว้ใน path ของ URL แต่วิธีสั่งให้ Claude ขอ path ใด ๆ ที่มีชื่อโดยตรงถูกบล็อก
กฎที่ web_fetch ใช้ในการตามลิงก์
- เพื่อให้
web_fetchเข้าถึง URL ได้ ต้องตรงตามหนึ่งในสามเงื่อนไขต่อไปนี้- URL ถูกใส่โดยตรงในข้อความของผู้ใช้
- URL ถูกใส่โดยตรงในผลลัพธ์
web_search - URL นั้นถูกลิงก์อยู่ในเนื้อหาของผลลัพธ์
web_fetchก่อนหน้า
- เงื่อนไขที่สามทำให้ Claude สามารถคลิกลิงก์ที่เห็นในหน้าก่อนหน้าได้ และหากผู้โจมตีเป็นเจ้าของเว็บไซต์ ก็สามารถควบคุมได้ว่าจะเปิดเผยลิงก์ใดบ้าง
เข้ารหัสข้อมูลลงใน URL ด้วยไดเรกทอรีตัวอักษร
- วางลิงก์อย่าง
/a,/b,/cฯลฯ ในหน้าแรก เพื่อสร้าง คีย์บอร์ดเสมือน ให้ Claude เลือกข้อมูลได้ - เมื่อขอให้ Claude ไปยังอักษรตัวแรกของชื่อ เซิร์ฟเวอร์บันทึกคำขอ
/ตามด้วย/a - ขยายโครงสร้างลิงก์แบบไดนามิก เพื่อให้เลือกตัวอักษรถัดไปได้ในแต่ละ path
/aลิงก์ไปยัง/aa,/ab,/acฯลฯ- path ถัด ๆ ไปก็สร้างต่อในลักษณะเดียวกัน เช่น
/aaa
- เมื่อให้สะกดชื่อจนสมบูรณ์ คำขอ
/a→/ay→/ayu→/ayus→/ayush→/ayush-paulถูกบันทึกตามลำดับ - แม้วิธีใส่ข้อมูลใด ๆ ลงใน URL โดยตรงจะถูกบล็อก แต่หากทำให้เลือกซ้ำ ๆ จากลิงก์ที่ถูกเปิดเผยแล้ว ก็สามารถ ส่งข้อมูลออกนอก sandbox ได้
Prompt injection ที่ปลอมเป็นการตรวจสอบ Cloudflare
- Prompt injection แบบโจ่งแจ้งไม่เสถียร และเป็นเรื่องยากที่จะหลอก Claude ด้วยหน้าที่ขอความลับผู้ใช้พร้อมให้ลิงก์น่าสงสัย
- สถานการณ์ปลอมตัวหลายแบบรวมถึงสมาชิกดูไม่เป็นธรรมชาติหรือน่าสงสัย จึงเลือกใช้ Cloudflare ซึ่งถูกใช้แพร่หลายและได้รับความเชื่อถือบนเว็บเป็นฉากหน้า
- ตกแต่งเว็บไซต์โจมตีให้เหมือนร้านกาแฟจริง แล้วสร้างเรื่องว่าเอเจนต์ต้องผ่านการตรวจสอบ Cloudflare เพื่อท่องเว็บอย่างอิสระแทนมนุษย์
- Turnstile ปลอมชักนำให้ Claude เลือกลิงก์ตามลำดับเพื่อกรอกชื่อเต็มและส่งข้อมูล
- เมื่อส่งเสร็จ จะให้เว็บไซต์ร้านกาแฟปกติ เพื่อไม่ให้ Claude รู้ตัวว่าถูกหลอก
- Claude กรอกชื่อทีละตัวโดยไม่ขออนุญาต และคำตอบสุดท้ายมีเพียงข้อมูลร้านกาแฟ โดยไม่ได้แจ้งว่ามีการส่งข้อมูลส่วนตัว
จากการรั่วไหลชื่อไปถึงการอนุมานคำถามความปลอดภัย
- เมื่อใส่ URL ร้านกาแฟอันตรายปะปนระหว่าง URL จริงหลายรายการ แล้วถามว่ากาแฟของที่ไหนดีที่สุด Claude ส่งข้อมูลต่อไปนี้อย่างต่อเนื่อง
- ชื่อ: Ayush Paul
- บริษัท: Beem
- บ้านเกิด: Charlotte, NC
- Claude ไม่ได้หยุดแค่ค้นหาบทสนทนาในอดีต แต่ยังอนุมานข้อสรุปใหม่จากข้อมูลเดิมด้วย
- แม้ไม่เคยบอกโดยตรงว่ามาจาก Charlotte แต่ Claude อนุมานบ้านเกิดจากชื่อของแฮกกาธอน Queen City Hacks ที่เริ่มทำสมัยมัธยมปลาย
แสดงหน้าต่างกันระหว่างมนุษย์กับ Claude
- เพื่อให้การโจมตีทำงาน ผู้ใช้ต้องสั่งให้ Claude เข้าเยี่ยมชมเว็บไซต์ ดังนั้นหน้าที่มนุษย์เห็นจึงต้องดูปกติ
- ใช้ประโยชน์จากข้อเท็จจริงที่ Claude ระบุตัวเองด้วย user agent
Claude-Userเพื่อแยกเนื้อหาตามผู้ร้องขอ- ให้เว็บไซต์ร้านกาแฟปกติกับผู้เข้าชมทั่วไป
- แสดง Turnstile ปลอมที่ทำให้กรอกข้อมูลส่วนตัว เฉพาะเมื่อ Claude เข้าถึง
- หากติด payload นี้เข้ากับเว็บไซต์ทั่วไป ผู้ใช้จะไม่พบสิ่งผิดปกติ แต่ทันทีที่ส่งเว็บไซต์นั้นให้ Claude ข้อมูลส่วนตัวอาจถูกส่งผ่านหน้าตรวจสอบปลอม
ดึงเว็บไซต์โจมตีเข้ามาอัตโนมัติจากผลการค้นหา
web_fetchเข้าถึงได้ไม่เพียง URL ที่ผู้ใช้ให้โดยตรง แต่ยังรวมถึง ผลลัพธ์web_searchด้วย- เมื่อ Claude พบหัวข้อใหม่หลังวันที่ตัดข้อมูลฝึก ก็จะค้นเว็บโดยอัตโนมัติ
- หากดันอันดับค้นหาของเว็บไซต์โจมตีที่ปรับตามข่าวใหม่ให้สูงขึ้น แม้ผู้ใช้ไม่ได้ให้ URL เว็บไซต์นั้นก็อาจถูกเลือกในคำถามที่เกี่ยวข้อง
- ตัวอย่างเช่น หากเว็บไซต์ร้านกาแฟอันตรายติดอันดับสูงในผลค้นหา ผู้ใช้ที่ถามทั่วไปเกี่ยวกับกาแฟใน Berkeley ก็อาจตกเป็นเป้าหมายได้
การยืนยันและมาตรการตามมาของ Anthropic
- ช่องโหว่นี้ถูก เปิดเผยอย่างรับผิดชอบ ผ่านโปรแกรมบั๊กบาวน์ตี HackerOne ของ Anthropic
- Anthropic ยืนยันว่าเคยพบปัญหานี้ภายในอยู่แล้ว แต่ในขณะนั้นไม่ได้แพตช์ และไม่ได้จ่ายรางวัลสำหรับรายงานนี้
- ต่อมาได้ปิดใช้งานความสามารถของ
web_fetchในการตามลิงก์ที่พบจากหน้าภายนอก - ปัจจุบันเป้าหมายการท่องเว็บถูกจำกัดไว้ที่ ผลลัพธ์
web_searchและ URL ที่ผู้ใช้ให้มาโดยตรง
เหนือกว่าหน่วยความจำไปถึงข้อมูลที่เชื่อมต่ออยู่
- ผู้ใช้เพียงถามหาร้านกาแฟ โดยไม่ได้คลิกลิงก์หรือเปิดใช้งาน integration ใหม่ แต่ Claude ส่งชื่อ·ที่ทำงาน·เมืองที่เติบโตไปยังภายนอก
- หน่วยความจำถูกเลือกเป็นเป้าหมายโจมตีที่ง่ายเพราะเปิดใช้เป็นค่าเริ่มต้นเท่านั้น
- วิธีเดียวกันนี้อาจเข้าถึงข้อมูลใน Google Drive·กล่องจดหมายอีเมล·MCP ที่เชื่อมต่ออยู่ ซึ่ง Claude สามารถดึงมาแทนผู้ใช้ได้
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
น่าประหลาดใจที่บริษัท AI ระดับแนวหน้าต่าง ๆ เปิดใช้ ฟีเจอร์หน่วยความจำ โดยแทบไม่มีแรงต่อต้านอะไรเลย ในอดีตวงการโฆษณาต้องคาดเดาข้อมูลปะติดปะต่อจากเว็บไซต์ที่ผู้ใช้เข้า แต่ตอนนี้ผู้คนส่งแทบทุกอย่างให้ AI โดยตรง รวมถึงความลับที่ลึกที่สุดด้วย
อาจเป็นเพราะผมทำงานในวงการโฆษณาเลยไวต่อเรื่องนี้เกินไป แต่ทันทีที่ Claude และ ChatGPT ออกหน่วยความจำมา ผมก็ปิดมันทันที และมันก็ไม่ได้มีประโยชน์ด้วย เพราะทำให้บริบทปนเปื้อนด้วยรายละเอียดที่ไม่เกี่ยวข้องจนคุณภาพลดลงด้วยซ้ำ สำหรับบทสนทนาส่วนตัว ใช้บัญชีแยกต่างหากบนที่อย่าง OpenRouter จะดีกว่า
ควรมีกฎห้ามบริษัท AI เก็บโปรไฟล์ผู้ใช้ และให้หน่วยความจำอยู่ บนเซิร์ฟเวอร์ของผู้ใช้เท่านั้น แม้กระทั่งการถือหุ้นไขว้กันระหว่างบริษัทหน่วยความจำกับบริษัท AI ก็น่าจะควรถูกห้ามด้วย
ได้รู้ว่าผู้คนรัน AI agent ด้วย สิทธิ์ผู้ดูแลระบบ โดยไม่มีแม้แต่การแยกด้วยคอนเทนเนอร์ น่าตกใจเหมือนเราลืมหลักการความปลอดภัยคอมพิวเตอร์ที่สั่งสมมา 50 ปีไปในชั่วข้ามคืน
ccoโฮมไดเรกทอรีก็ยังถูกเปิดเผยอยู่ และเพียง prompt เดียว agent ก็สามารถส่งรหัสผ่านในเบราว์เซอร์ออกไปด้วยcurlได้หากจะป้องกัน ต้องมีโฮมไดเรกทอรีปลอมและ allowlist เครือข่ายที่อนุญาตเฉพาะผู้ให้บริการอย่าง llama.cpp หรือ OpenAI ไม่มีวิธีแก้แบบข้ามแพลตฟอร์มที่ใช้ง่าย และสำหรับการพัฒนาแอป native ที่ต้องคอมไพล์และแก้ข้อผิดพลาดเฉพาะแพลตฟอร์มเอง แม้แต่เครื่อง Linux ที่ติดตั้ง Docker ก็ยังไม่พอ
ในเมื่อปัจจุบันเราปรับบริบทให้เหมาะสมเพื่อลดต้นทุนกันอยู่แล้ว ในอนาคตมีความเป็นไปได้สูงที่จะปฏิบัติกับตัวบริบทเองในฐานะขอบเขตความปลอดภัย
ผมตั้งชื่อใน Claude ไว้ว่า Silly Bean ตอนแรกทำเพราะคำทักทาย “Back again, Silly Bean?” มันตลก แต่สุดท้ายกลับกลายเป็นหมากรุกความปลอดภัยสี่มิติ
จนตอนนี้ก็ยังปล่อยไว้อย่างนั้น ใช้เป็นเครื่องหมายไว้เยาะเย้ยหรือปลอบใจแบบขมขื่นว่ามันเป็นผลิตภัณฑ์แบบพึ่งพาที่ไม่ได้ฉลาดอย่างที่คิด
ประเด็นที่ว่า Cloudflare ใช้
robots.txtแบบเข้มงวดเกินไปโดยไม่ได้รับความยินยอม เป็นภาพที่พบไม่บ่อยนักของการบ่นว่าเว็บไซต์ได้รับการปกป้องจากสแครปเปอร์robots.txtผู้ใช้ต้องเปิดฟีเจอร์เอง น่าจะมีโอกาสเปิดโดยไม่ตั้งใจได้ เพราะคลิกครั้งเดียวก็พอrobots.txtก็ไม่สามารถหยุดสแครปเปอร์ที่ตั้งใจจริงได้ด้วยผมรัน Claude Code ใน VM ที่ไม่มี credential และใช้โดยโคลนเฉพาะ repository GitHub โอเพนซอร์สที่จะทำงาน เมื่อก่อนรีเซ็ต VM ทุกวัน แต่ยุ่งยากเลยเปลี่ยนเป็นเดือนละครั้ง และต่อให้หลุดออกไปก็อย่างมากคือรายการโอเพนซอร์สที่ทำในช่วงเดือนที่ผ่านมา
ข้อมูลนี้ก็อาจเผยตัวตนได้มากพอสมควร แต่ชื่อและอีเมลของผู้ร่วมพัฒนาโอเพนซอร์สจะอยู่ในประวัติ Git ที่แก้ไม่ได้อยู่แล้ว ดังนั้นส่วนใหญ่ก็ค้นเจอใน Google ได้อยู่ดี เห็นเรื่องนี้แล้วกำลังคิดว่าจะเปลี่ยนรอบรีเซ็ตเป็นรายสัปดาห์
ถ้าจะตั้งคุกสำหรับ AI agent ก็ใช้สคริปต์ที่ https://jai.scs.stanford.edu/arch-vm.html แล้วเพิ่มแพ็กเกจอย่าง
dotnet-sdkเข้าไปในคำสั่งpacstrapก็น่าจะใช้ได้ หากทำ root ของ guest เป็น BTRFS subvolume แล้วใช้ snapshot ก็สร้าง VM ใหม่ได้ทันทีด้วยsudo btrfs subvol snap template-root newvmและการรันqemu-system-x86_64ก็ใช้เวลาเพียงไม่กี่วินาที พร้อมควบคุมเนื้อหาใน VM ได้ทั้งหมดบางงานต้องให้คนกดปุ่มเพื่อตัดสินว่าประสบการณ์ผู้ใช้ถูกต้องหรือไม่ และถ้าเป็นไปได้ก็ไม่อยากให้ AI มีสิทธิ์เข้าถึงหน้าจอ โมเดล VM แบบนี้ทำงานได้ดีมากกับปัญหาบางประเภท แต่ขอบเขตที่ใช้ได้ก็น่าเสียดายที่แคบ
ประเด็นที่ว่า “สวัสดีครับ/ค่ะ นี่คือ Cloudflare ขอข้อมูลส่วนตัวหน่อย” ยังใช้ได้ผล ทำให้ prompt injection ยังคงเป็นปัญหาอย่างเลี่ยงไม่ได้ ไม่เช่นนั้นก็ต้องจำกัดโมเดลจนแทบไร้ประโยชน์ หรือยอมให้การโจมตีแบบนี้แทรกซึมเข้ามา จนสร้างแนวคิดที่ไม่ปลอดภัยที่สุดในประวัติศาสตร์อินเทอร์เน็ตขึ้นมา นั่นคือหุ่นยนต์ที่หลอกได้
ดูเหมือนโครงสร้างที่เราไม่มีวิธีเข้าใจการทำงานภายในในเชิงฟังก์ชันหรือแยกส่วนมันออกมา ทำได้เพียงโน้มน้าวก้อนขนาดมหึมาก้อนเดียวให้ทำงาน แล้วภาวนาว่าผู้โจมตีจะโน้มน้าวมันได้ไม่ดีกว่าเรา
ช่วงหลังเจอเรื่องค่อนข้างหลอนในแอป ChatGPT บน iPhone เพื่อนสนิทคนหนึ่งใช้บัญชีของตัวเองถามปัญหาเกี่ยวกับเครื่องให้อาหารสัตว์เลี้ยงอัจฉริยะ แต่ตอน ChatGPT ตอบ กลับใช้ ชื่อสัตว์เลี้ยงของฉัน
ชื่อนั้นก็ไม่ใช่ชื่อทั่วไป แถมยังมีความเชื่อมโยงกับเพื่อนคนนี้ จึงยากจะมองว่าเป็นเรื่องบังเอิญ พอคิดว่าเพื่อนเคยเชื่อมต่อ Wi-Fi บ้านเรา ก็เลยสงสัยว่าอาจมี cache contamination หรือข้อมูลเซสชันรั่วไหลหรือไม่
ฟีเจอร์นี้ยังไม่พร้อมนัก ดังนั้น ปิด memory ไว้ น่าจะดีกว่า แต่ถ้าเพื่อนใช้บัญชีของตัวเองจริง ๆ ปรากฏการณ์นี้ก็อธิบายได้ยาก
Claude Code ใส่ ชื่อและอีเมลของฉันใน User-Agent ตอน scrape เอกสารของ SEC ไม่ต้องใช้ prompt แยบยลอะไรเลย และตัวไอเดียเองก็ไม่ได้แย่มากนัก แต่ถ้าถามก่อนก็คงดี
SEC_EDGAR_USER_AGENT="Your Name (name@domain.com)"ดังนั้น Claude ก็แค่ทำตามคำสั่งเท่านั้น บางทีตรงนี้อาจยิ่งอันตรายกว่าเดิมด้วยซ้ำสงสัยว่ามีผู้ใช้กี่คนที่เปิด global memory ซึ่งมีผลกับบทสนทนาทั้งหมด memory แบบนี้สุดท้ายน่าจะส่งผลเสียต่อคุณภาพของ output
ในทางกลับกัน ก็มีประโยชน์ในบางจังหวะที่ไม่ต้องอธิบายบริบทอย่างยืดยาวทุกครั้ง
เพราะอย่างนั้นจึงไม่เปิด memory และก็ไม่ได้ใช้ Claude Code ด้วยเหตุผลอื่นเช่นกัน ระบบ memory ในปัจจุบันหยาบเกินไป จนไม่มีประโยชน์