การป้องกัน CSRF ด้วยส่วนหัว CORS Origin เทียบกับโทเค็น CSRF


103

คำถามนี้เกี่ยวกับการป้องกันการโจมตีด้วยการปลอมแปลงคำขอข้ามไซต์เท่านั้น

โดยเฉพาะเกี่ยวกับ: การป้องกันผ่านส่วนหัว Origin (CORS) ดีเท่ากับการป้องกันผ่านโทเค็น CSRF หรือไม่?

ตัวอย่าง:

  • อลิซเข้าสู่ระบบ (โดยใช้คุกกี้) ด้วยเบราว์เซอร์ของเธอไปที่ " https://example.com " ฉันคิดว่าเธอใช้เบราว์เซอร์ที่ทันสมัย
  • อลิซไปที่ " https://evil.com " และโค้ดฝั่งไคลเอ็นต์ของ evil.com ดำเนินการขอ " https://example.com " (สถานการณ์ CSRF แบบคลาสสิก)

ดังนั้น:

  • หากเราไม่ตรวจสอบส่วนหัว Origin (ฝั่งเซิร์ฟเวอร์) และไม่มีโทเค็น CSRF เรามีช่องโหว่ด้านความปลอดภัย CSRF
  • หากเราตรวจสอบโทเค็น CSRF แสดงว่าเราปลอดภัย (แต่น่าเบื่อเล็กน้อย)
  • หากเราตรวจสอบส่วนหัว Origin คำขอจากโค้ดฝั่งไคลเอ็นต์ของ evil.com ควรถูกบล็อกเช่นเดียวกับที่ทำเมื่อใช้โทเค็น CSRF - ยกเว้นหากเป็นไปได้ที่โค้ดของ evil.com จะตั้งค่าส่วนหัว Origin

ฉันรู้ว่าสิ่งนี้ไม่ควรเป็นไปได้กับ XHR (ดูเช่นความปลอดภัยสำหรับการแบ่งปันทรัพยากรข้ามแหล่งกำเนิด ) อย่างน้อยก็ไม่ถ้าเราเชื่อมั่นว่าข้อมูลจำเพาะ W3C จะถูกนำไปใช้อย่างถูกต้องในเบราว์เซอร์สมัยใหม่ทั้งหมด (เราทำได้ไหม)

แต่คำขอประเภทอื่น ๆ เช่นส่งแบบฟอร์มล่ะ? กำลังโหลดแท็ก script / img / ... ? หรือวิธีอื่นใดที่เพจสามารถใช้เพื่อสร้างคำขอ (ตามกฎหมาย) ได้? หรือบางคนอาจรู้จักแฮ็ค JS?

หมายเหตุ: ฉันไม่ได้พูดถึง

  • แอปพลิเคชันเนทีฟ
  • เบราว์เซอร์ที่มีการจัดการ
  • ข้อบกพร่องการเขียนสคริปต์ข้ามไซต์ในหน้าของ example.com
  • ...

1
ฉันเชื่อว่าพร็อกซีจำนวนมากตัดส่วนหัวต้นทาง
thefourtheye

และสำหรับแท็กส่งแบบฟอร์มและแท็ก img / สคริปต์เราควรพึ่งพา CSPs แต่ไม่แน่ใจเกี่ยวกับเบราว์เซอร์รุ่นเก่า
thefourtheye

3
@thefourtheye: เนื่องจากการเชื่อมต่อเริ่มต้นผ่าน TLS ผู้ใช้จึงมีปัญหาเร่งด่วนมากกว่า CSRF หากพร็อกซีสามารถจัดการกับเขา / เธอได้
Perseids

2
@thefourtheye ทำไมพวกเขาถึงเปลื้องผ้าOrigin? นั่นจะเป็นการลบล้างการป้องกัน CORS
Paul Draper

1
ฉันชอบคำถามนี้และคำตอบเพราะเป็นคำถามที่เฉพาะเจาะจง แต่ก็ทำให้ฉันนึกถึงความแตกต่างระหว่าง CSRF และ CORS ด้วย (ฉันยอมรับว่าแนวคิดเหล่านี้ไม่ใช่แนวคิดที่สับสนง่ายๆ ... แต่ฉันก็ยังคงสับสนได้)
Red Pea

คำตอบ:


41

โปรดทราบว่าสิ่งนี้ไม่ควรเป็นไปได้กับ XHR (ดูเช่นความปลอดภัยสำหรับการแบ่งปันทรัพยากรข้ามแหล่งกำเนิด) อย่างน้อยก็ไม่หากเราเชื่อมั่นว่าข้อกำหนด W3C จะนำไปใช้อย่างถูกต้องในเบราว์เซอร์สมัยใหม่ทั้งหมด (ทำได้หรือไม่)

ในตอนท้ายของวันคุณต้อง "ไว้วางใจ" เบราว์เซอร์ไคลเอนต์เพื่อจัดเก็บข้อมูลของผู้ใช้อย่างปลอดภัยและปกป้องเซสชันฝั่งไคลเอ็นต์ หากคุณไม่ไว้วางใจเบราว์เซอร์ไคลเอนต์คุณควรหยุดใช้เว็บเลยสำหรับสิ่งอื่นที่ไม่ใช่เนื้อหาคงที่ ถึงแม้จะมีการใช้ราชสกุล CSRF คุณจะไว้วางใจเบราว์เซอร์ของลูกค้าได้อย่างถูกต้องเชื่อฟังเดียวกันนโยบายแหล่งกำเนิดสินค้า

แม้ว่าจะมีช่องโหว่ของเบราว์เซอร์ก่อนหน้านี้เช่นในIE 5.5 / 6.0ซึ่งเป็นไปได้ที่ผู้โจมตีจะข้ามนโยบายแหล่งกำเนิดเดียวกันและดำเนินการโจมตีโดยทั่วไปคุณสามารถคาดหวังว่าสิ่งเหล่านี้จะได้รับการแก้ไขทันทีที่ค้นพบและเบราว์เซอร์ส่วนใหญ่จะอัปเดตโดยอัตโนมัติ ความเสี่ยงนี้ส่วนใหญ่จะบรรเทาลง

แต่คำขอประเภทอื่น ๆ เช่นส่งแบบฟอร์มล่ะ? กำลังโหลดแท็ก script / img / ... ? หรือวิธีอื่นใดที่เพจสามารถใช้เพื่อสร้างคำขอ (ตามกฎหมาย) ได้? หรือบางคนอาจรู้จักแฮ็ค JS?

โดยOriginปกติส่วนหัวจะถูกส่งสำหรับคำขอข้ามโดเมน XHR เท่านั้น คำขอรูปภาพไม่มีส่วนหัว

หมายเหตุ: ฉันไม่ได้พูดถึง

  • แอปพลิเคชันเนทีฟ

  • เบราว์เซอร์ที่มีการจัดการ

  • ข้อบกพร่องการเขียนสคริปต์ข้ามไซต์ในหน้าของ example.com

ฉันไม่แน่ใจว่าสิ่งนี้อยู่ภายใต้เบราว์เซอร์ที่ถูกควบคุมหรือไม่ แต่Flash เวอร์ชันเก่าอนุญาตให้ตั้งค่าส่วนหัวโดยพลการซึ่งจะทำให้ผู้โจมตีสามารถส่งคำขอพร้อมrefererส่วนหัวที่ปลอมแปลงจากเครื่องของเหยื่อเพื่อทำการโจมตีได้


ตัวอย่าง Flash เป็นตัวอย่างที่ดีและบางทีปลั๊กอินอื่น ๆ อาจมีช่องโหว่ที่คล้ายกัน ฉัน (น่าเสียดาย) สามารถปกป้องอลิซจาก CSRF ได้เท่านั้นถ้าเธอใช้เบราว์เซอร์ที่ทันสมัย ​​ฯลฯ นั่นชัดเจน แต่ก็ไม่ใช่เรื่องที่ไม่สมเหตุสมผลแม้ว่าเธอจะเป็นผู้ใช้ที่ตระหนักถึงความปลอดภัย แต่เธอก็อาจติดตั้งปลั๊กอินของบุคคลที่สามโดยเฉพาะอย่างยิ่งเมื่อมาจาก บริษัท ขนาดใหญ่ (ที่น่าเชื่อถือ) แม้ว่าพวกเขาอาจเขียนปลั๊กอินที่ปลอดภัย แต่ฉันก็ไม่มั่นใจ 100% ถ้าพวกเขาคิดถึง CSRF ด้วย! ดังนั้นหากแซนด์บ็อกซ์ของเบราว์เซอร์ จำกัด ไม่ให้ปลั๊กอินละเมิด SOP (อาจเป็นไปได้ไหม) ฉันขอแนะนำให้ใช้โทเค็น CSRF
Chris Lercher

@ChrisLercher: ใช่ปลั๊กอินสมัยนี้ดูเหมือนจะแข็งแกร่งกว่าเล็กน้อย อย่างไรก็ตามเมื่อใดก็ตามที่อาจมีการเปิดตัวเวอร์ชันใหม่ที่ช่วยให้ผู้โจมตีสามารถใช้ประโยชน์จากเวอร์ชันดังกล่าวเพื่อหลีกเลี่ยงการป้องกันเบราว์เซอร์ วิธีที่ดีที่สุดในการจัดการ (เช่นโทเค็น / ส่วนหัว) จะขึ้นอยู่กับความอ่อนไหวของข้อมูลของคุณและความเสี่ยงนั้นยอมรับได้หรือไม่ Flash เป็นไปตาม SOP แต่ต้นกำเนิดของปลั๊กอิน Flash คือไซต์ที่โหลดมา (แทนที่จะเป็นไซต์เรียกเช่น JavaScript) มีcrossdomain.xmlที่สามารถเปิดใช้งานการสื่อสารข้ามโดเมน
SilverlightFox

27

เนื้อหาเว็บไม่สามารถแทรกแซงส่วนหัว Origin ได้ นอกจากนี้ภายใต้นโยบายต้นทางเดียวกันจุดเริ่มต้นหนึ่งไม่สามารถส่งส่วนหัวที่กำหนดเองไปยังต้นทางอื่นได้ [1]

ดังนั้นการตรวจสอบส่วนหัว Origin จึงสามารถบล็อกการโจมตีได้ดีพอ ๆ กับการใช้โทเค็น CSRF

ข้อกังวลหลักในการพึ่งพาสิ่งนี้คือการอนุญาตให้คำขอที่ถูกต้องตามกฎหมายทั้งหมดทำงานได้หรือไม่ ผู้ถามทราบเกี่ยวกับปัญหานี้และได้ตั้งคำถามเพื่อแยกแยะกรณีสำคัญ ๆ ออกไป (ไม่มีเบราว์เซอร์เก่า HTTPS เท่านั้น)

ผู้จำหน่ายเบราว์เซอร์ปฏิบัติตามกฎเหล่านี้ แต่สิ่งที่เกี่ยวกับปลั๊กอิน? อาจไม่ได้ แต่คำถามไม่สนใจ "เบราว์เซอร์ที่ถูกปรับเปลี่ยน" แล้วจุดบกพร่องในเบราว์เซอร์ที่ทำให้ผู้โจมตีปลอมแปลงส่วนหัว Origin ล่ะ? อาจมีข้อบกพร่องที่ทำให้โทเค็น CSRF รั่วไหลข้ามต้นกำเนิดได้เช่นกันดังนั้นจึงต้องใช้เวลามากขึ้นในการโต้แย้งว่าอันหนึ่งดีกว่าอีกอันหนึ่ง


5
ฉันเพิ่งทดสอบ Firefox 47 และไม่ได้ส่งส่วนหัวต้นทางสำหรับโพสต์แบบฟอร์มข้ามแหล่งที่มา (วิธีทั่วไปในการโจมตีบริการ REST ที่ไม่เปิดใช้ CORS สำหรับ XHR) ดังนั้นฉันจึงไม่คิดว่าจะมีการตรวจสอบส่วนหัวต้นทาง จะมีผลถ้าผู้ใช้ใช้ Firefox
Andy

3
สำหรับการอ้างอิงปัญหาของ Firefox ที่ไม่ส่งส่วนหัว "Origin" ติดตามได้ที่ Bugzilla: bugzilla.mozilla.org/show_bug.cgi?id=446344คุณสามารถเลือกที่จะตรวจสอบส่วนหัว "ผู้อ้างอิง" ในกรณีนี้ได้ แต่จากประสบการณ์ของฉัน ผู้ใช้ Firefox บล็อกส่วนหัว "ผู้อ้างอิง" เนื่องจากปัญหาความเป็นส่วนตัว (แม้ว่า IMHO จะเพียงพอที่จะตัดเส้นทางและข้อความค้นหา)
Steffen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.