vdso และ vsyscall คืออะไร?


89

ฉันทำ sudo cat /proc/1/maps -vv

ฉันพยายามทำความเข้าใจกับผลลัพธ์ฉันเห็นไลบรารีที่แชร์จำนวนมากถูกแมปกับเซ็กเมนต์การแมปหน่วยความจำตามที่คาดไว้

ในตอนท้ายมีบางอย่างเช่น

อะไรvdsoและvsyscallหมายความว่าอย่างไร vsyscall เป็นส่วนเคอร์เนลของหน่วยความจำหรือไม่ จะเป็นการดีมากหากใครก็ตามสามารถให้ความสำคัญกับปัญหาได้


5
Google เพื่อVDSOให้นี้VDSO wikipage (ซึ่งมีการอ้างอิงต่อไป)
Basile Starynkevitch

เอกสารประกอบ procfsดูที่เวอร์ชันเคอร์เนลของไฟล์นี้สำหรับข้อมูลเฉพาะสำหรับระบบของคุณ
ไร้เสียงรบกวนใน

ฉันคิดว่าคำอธิบายที่ดีกว่าว่าสิ่งที่สามารถพบได้ใน wiki หรือในเอกสารประกอบ procfs เป็นสิ่งจำเป็นสำหรับหัวข้อนี้
Giuseppe Pes

คำตอบ:


151

vsyscallและvDSOกลุ่มสองกลไกที่ใช้ในการเร่งการสายระบบบางอย่างในลินุกซ์ ตัวอย่างเช่นgettimeofdayมักจะเรียกใช้ผ่านกลไกนี้ กลไกแรกที่นำมาใช้คือvsyscallซึ่งถูกเพิ่มเข้ามาเพื่อเรียกใช้การเรียกระบบเฉพาะที่ไม่จำเป็นต้องใช้สิทธิ์ระดับใดในการรันเพื่อลดค่าใช้จ่ายในการโทรของระบบ ทำตามตัวอย่างก่อนหน้านี้สิ่งที่gettimeofdayต้องทำคืออ่านเวลาปัจจุบันของเคอร์เนล มีแอพพลิเคชั่นที่เรียกใช้gettimeofdayบ่อย (เช่นเพื่อสร้างการประทับเวลา) จนถึงจุดที่พวกเขาสนใจเรื่องค่าใช้จ่ายเล็กน้อย เพื่อแก้ไขข้อกังวลนี้เคอร์เนลจะแมปลงในพื้นที่ของผู้ใช้หน้าที่มีเวลาปัจจุบันและเวลาที่รวดเร็วgettimeofdayการนำไปใช้งาน (เช่นฟังก์ชั่นที่อ่านเวลาที่บันทึกไว้ในvsyscall ) นี้โดยใช้สายระบบเสมือนห้องสมุด C สามารถให้บริการได้อย่างรวดเร็วgettimeofdayซึ่งไม่ได้มีค่าใช้จ่ายที่นำโดยสวิทช์บริบทระหว่างพื้นที่เคอร์เนลและพื้นที่ของผู้ใช้มักจะแนะนำให้รู้จักกับรูปแบบการเรียกระบบคลาสสิกหรือINT 0x80SYSCALL

อย่างไรก็ตามกลไกvsyscallนี้มีข้อ จำกัด บางประการ: หน่วยความจำที่จัดสรรมีขนาดเล็กและอนุญาตให้มีการเรียกระบบเพียง 4 ครั้งเท่านั้นและที่สำคัญและจริงจังกว่านั้นเพจvsyscallจะถูกจัดสรรแบบคงที่ให้กับแอดเดรสเดียวกันในแต่ละกระบวนการเนื่องจากตำแหน่งของเพจvsyscallคือ ตอกลงในเคอร์เนล ABI การจัดสรรแบบคงที่ของ vsyscall นี้ทำให้ผลประโยชน์ที่ได้รับมาจากการสุ่มพื้นที่หน่วยความจำที่ Linux ใช้กันทั่วไป ผู้โจมตีหลังจากโจมตีแอปพลิเคชันโดยใช้ประโยชน์จากสแตกล้นสามารถเรียกระบบจากvsyscallหน้าที่มีพารามิเตอร์ตามอำเภอใจ สิ่งที่เขาต้องการคือที่อยู่ของการเรียกระบบซึ่งสามารถคาดเดาได้ง่ายเนื่องจากมีการจัดสรรแบบคงที่ (หากคุณพยายามเรียกใช้คำสั่งของคุณอีกครั้งแม้จะมีแอปพลิเคชันที่แตกต่างกันคุณจะสังเกตเห็นว่าที่อยู่ของvsyscallไม่เปลี่ยนแปลง) จะเป็นการดีที่จะลบหรืออย่างน้อยก็สุ่มตำแหน่งของหน้า vsyscall เพื่อขัดขวางการโจมตีประเภทนี้ น่าเสียดายที่แอปพลิเคชันขึ้นอยู่กับการมีอยู่และที่อยู่ที่แน่นอนของหน้านั้นจึงไม่สามารถทำได้

ปัญหาด้านความปลอดภัยนี้ได้รับการแก้ไขแล้วโดยแทนที่คำแนะนำการโทรระบบทั้งหมดในที่อยู่ที่กำหนดโดยคำสั่งกับดักพิเศษ แอปพลิเคชันที่พยายามโทรเข้าสู่หน้าvsyscallจะดักเข้าเคอร์เนลซึ่งจะจำลองการเรียกระบบเสมือนที่ต้องการในพื้นที่เคอร์เนล ผลลัพธ์คือการเรียกระบบเคอร์เนลที่เลียนแบบการเรียกระบบเสมือนซึ่งถูกวางไว้ที่นั่นเพื่อหลีกเลี่ยงการเรียกระบบเคอร์เนลในตอนแรก ผลลัพธ์คือvsyscallซึ่งใช้เวลาดำเนินการนานกว่า แต่ที่สำคัญคือไม่ทำลาย ABI ที่มีอยู่ ในกรณีใด ๆ ชะลอตัวจะได้รับการเห็นว่าโปรแกรมจะพยายามที่จะใช้vsyscallหน้าแทนvDSO

vDSOมีฟังก์ชันการทำงานเช่นเดียวกับ vsyscall ในขณะที่การเอาชนะข้อ จำกัด ของมัน vDSO (Virtual Dynamically linked Shared Objects) เป็นพื้นที่หน่วยความจำที่จัดสรรในพื้นที่ผู้ใช้ซึ่งจะแสดงฟังก์ชันเคอร์เนลบางส่วนที่พื้นที่ผู้ใช้ในลักษณะที่ปลอดภัย สิ่งนี้ได้รับการแนะนำเพื่อแก้ปัญหาภัยคุกคามด้านความปลอดภัยที่เกิดจากไฟล์vsyscall. vDSO ได้รับการจัดสรรแบบไดนามิกซึ่งช่วยแก้ปัญหาด้านความปลอดภัยและสามารถเรียกระบบได้มากกว่า 4 สาย vDSOการเชื่อมโยงจะให้ผ่านทางห้องสมุด glibc ลิงเกอร์จะเชื่อมโยงใน glibc vDSOการทำงานโดยมีเงื่อนไขว่ากิจวัตรประจำวันเช่นมีประกอบvDSOgettimeofdayรุ่นเช่น เมื่อโปรแกรมของคุณทำงานหากเคอร์เนลของคุณไม่มีvDSO การสนับสนุนจะทำ syscall แบบดั้งเดิม

เครดิตและลิงค์ที่เป็นประโยชน์:


3
ทำไม vsyscall มีเพียง 4 การโทรระบบ? มีการสงวนไว้ 8 เมกะไบต์สำหรับการเรียกระบบและใช้เพียง 1 เพจ (จริงๆแล้วมี 3 ฟังก์ชันซึ่งกำหนดโดย 1024 take 1 page)
skap

9

ฉันแค่ต้องการเพิ่มว่าตอนนี้ในเมล็ดพันธุ์ใหม่vDSOไม่ได้ใช้สำหรับ syscall ที่ "ปลอดภัย" เท่านั้น แต่ใช้เพื่อตัดสินใจว่ากลไก syscall ใดเป็นวิธีที่ต้องการในการเรียกใช้ syscall ในระบบ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.