จะป้องกันการโจมตีมลพิษต้นแบบได้อย่างไร

Ca Pxngkan Kar Comti Mlphis Tnbaeb Di Xyangri



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

คู่มือนี้จะอธิบายวิธีป้องกันการโจมตีจากมลภาวะต้นแบบ







ป้องกันการโจมตีมลพิษต้นแบบ?

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



ในตัวอย่างโค้ดด้านล่างนี้ โค้ดมลพิษต้นแบบจะถูกแทรก:



ค่าคงที่ y = { ก: 1 ข: 2 } ;
ข้อมูล const = JSON.parse ( '{'__proto__': { 'ผิดพลาด': จริง}}' ) ;

const c = Object.มอบหมาย ( { } และข้อมูล ) ;
console.log ( ค.มีข้อบกพร่อง ) ;


คำอธิบายของข้อมูลโค้ดข้างต้น:





    • อันดับแรก รายการชื่อ “ และ ” ถูกสร้างขึ้นและเก็บค่าไว้ในคู่คีย์-ค่า
    • ด้วยความช่วยเหลือของ “ -ดังนั้น- ” มีการใช้รหัสสุ่มที่ปนเปื้อนในรูปแบบคีย์-ค่า กุญแจถูกตั้งค่าเป็น “ ผิดพลาด ” และค่าที่กำหนดของ “ จริง '.
    • จากนั้นรหัสที่ปนเปื้อนนี้จะถูกกำหนดให้กับ “ และ ” รายการโดยการเรียกใช้ “ กำหนด() ” และรายการผลลัพธ์จะถูกจัดเก็บไว้ในรายการใหม่ชื่อ “ '.
    • สุดท้ายโค้ดปนเปื้อนที่ถูกแทรกเข้าไปในส่วน “ ” รายการจะถูกดึงออกมาและค่าของมันจะแสดงบนคอนโซล เพื่อให้แน่ใจว่ามีมลพิษหรือข้อมูลที่เป็นอันตรายถูกฉีดเข้าไป

หลังจากดำเนินการไฟล์ที่มีเอาต์พุตแล้ว เอาต์พุตจะแสดงว่าโค้ดที่เป็นอันตรายถูกแทรกเข้าไปสำเร็จแล้ว และค่าของโค้ดนั้นถูกดึงกลับมาแล้ว:



จะป้องกันการโจมตีมลพิษต้นแบบได้อย่างไร

มีหลายวิธีที่สามารถป้องกันการโจมตีจากมลพิษต้นแบบได้:

การผสานแบบเรียกซ้ำที่ไม่ปลอดภัย:

หลีกเลี่ยงการผสานแบบเรียกซ้ำที่ไม่ปลอดภัย เนื่องจากอาจนำไปสู่การโจมตีที่สร้างมลภาวะต้นแบบได้:

โดยที่ผสาน = ( ใช้เวลา ,src ) = > {
สำหรับ ( แอตทริบิวต์ var ใน src ) {
ถ้า ( ประเภทของ ( ใช้เวลา [ คุณลักษณะ ] ) === 'อ็อบเจ' && ประเภทของ ( src [ คุณลักษณะ ] ) === 'อ็อบเจ' )
{
ผสาน ( ใช้เวลา [ คุณลักษณะ ] ,src [ คุณลักษณะ ] ) ;
} อื่น {
ใช้เวลา [ คุณลักษณะ ] = สอาร์ค [ คุณลักษณะ ] ;
}
}
กลับ ใช้เวลา ;
} ;


ในโค้ดข้างต้น:

    • ขั้นแรก ฟังก์ชันแบบกำหนดเอง “ ผสาน() ” ถูกสร้างขึ้นที่ยอมรับพารามิเตอร์อาร์เรย์สองตัว “ ใช้เวลา ' และ ' src '.
    • ที่ได้รับการปรับปรุง” สำหรับ ” ลูปถูกใช้เพื่อวนซ้ำตัวแปร” คุณลักษณะ ” เกินกว่าที่ให้ไว้ “ src ” พารามิเตอร์
    • ภายในวงใช้ ' ถ้า ” คำสั่งที่นำทางผ่านข้อผิดพลาดทั้งสองและหากองค์ประกอบใด ๆ ที่อยู่ในอาร์เรย์ทั้งสองมีประเภทข้อมูลเหมือนกัน จากนั้นองค์ประกอบเหล่านั้นจะถูกส่งผ่านเป็นพารามิเตอร์ไปยังตัวเดียวกัน” ผสาน() ” ฟังก์ชันที่สร้างลักษณะการเรียกซ้ำ
    • หากประเภทไม่เหมือนกัน ค่าองค์ประกอบจะอยู่ใน ' src ” อาร์เรย์พารามิเตอร์ถูกส่งไปที่ “ ใช้เวลา ” พารามิเตอร์
    • ในที่สุด “ ใช้เวลา ” อาร์เรย์พารามิเตอร์ได้รับการส่งคืน

การแช่แข็งต้นแบบ

การป้องกันการโจมตีมลพิษต้นแบบอีกประการหนึ่งคือการหยุดวงจรการดำเนินการ ซึ่งทำได้ผ่านทาง “ วัตถุตรึง() ' วิธี. ในตัวอย่างด้านล่าง โค้ดต้นแบบที่ปนเปื้อนที่ถูกฉีดด้านบนจะถูกแช่แข็ง:

ค่าคงที่ y = { ก: 1 ข: 2 } ;
ข้อมูล const = JSON.parse ( '{'__proto__': { 'ผิดพลาด': จริง}}' ) ;

const c = Object.มอบหมาย ( { } และข้อมูล ) ;
console.log ( ค.มีข้อบกพร่อง ) ;

console.log ( Object.freeze ( ค.มีข้อบกพร่อง ) ) ;
console.log ( Object.isFrozen ( ค.มีข้อบกพร่อง ) ) ;


คำอธิบายของโค้ดข้างต้นแสดงอยู่ด้านล่าง:

    • ในตอนแรก โค้ดที่ปนเปื้อนต้นแบบจำลองจะถูกแทรกเข้าไปในรายการจำลอง” และ ” เช่นเดียวกับที่อธิบายไว้ในส่วนข้างต้น
    • แล้วฉีดกุญแจเสีย” ผิดพลาด ” ถูกส่งผ่านไปยัง “ แช่แข็ง() ” วิธีการแช่แข็งส่วนที่ปนเปื้อน
    • ในที่สุด เพื่อยืนยันส่วนมลพิษต้นแบบแช่แข็ง “ ผิดพลาด ” คีย์รายการ “ ” ถูกส่งผ่านไปยัง “ ถูกแช่แข็ง() ' วิธี. วิธีการนี้จะคืนค่า “ จริง ” กรณีแช่แข็ง และ “ เท็จ ” ในกรณีที่ไม่แช่แข็ง:

หลังจากดำเนินการโค้ดที่มีผลลัพธ์แล้ว เอาต์พุตจะแสดงการฉีด การแช่แข็ง และการตรวจสอบความถูกต้องของโค้ดที่ปนเปื้อนที่ถูกแช่แข็ง:


เคล็ดลับเพิ่มเติมเพื่อป้องกันการโจมตีจากมลพิษต้นแบบ

เคล็ดลับเพิ่มเติมบางประการโดยใช้การป้องกันการโจมตีจากมลพิษต้นแบบมีดังต่อไปนี้:

    • ตัวเลือกของ “ –ปิดการใช้งานโปรโต ” สามารถใช้เพื่อปิดการใช้งานหรือหยุดการทำงานของ” ต้นแบบ.__โปรโต__ ' คุณสมบัติ.
    • อย่าใช้วิธีการที่มีความช่วยเหลือของ “ ต้นแบบ '.
    • โดย ' การฆ่าเชื้ออินพุตของผู้ใช้ ” ซึ่งเกี่ยวข้องกับการตรวจสอบและการกรองอินพุตของผู้ใช้เพื่อลบโค้ดที่เป็นอันตรายหรือปนเปื้อน
    • การใช้ “ รายการที่อนุญาต ” ซึ่งเป็นรายการคุณสมบัติและวิธีการที่อนุญาตสำหรับออบเจ็กต์ ความพยายามในการตั้งค่าหรือรับคุณสมบัติหรือวิธีการที่ไม่ใช่สมาชิกของไวท์ลิสต์จะถูกบล็อก

นั่นคือทั้งหมดที่เกี่ยวกับการป้องกันการโจมตีมลพิษต้นแบบใน Node.js

บทสรุป

เพื่อป้องกันการโจมตีจากมลภาวะของต้นแบบ วิธีการต่างๆ เช่น การหลีกเลี่ยงการผสานแบบเรียกซ้ำที่ไม่ปลอดภัย การหยุดการทำงานของต้นแบบ และการใช้ไวท์ลิสต์เพื่อป้องกัน “ __ดังนั้น__ ” สามารถใช้คุณสมบัติจากการตั้งค่าได้ ควบคู่ไปกับการใช้ “ –ปิดการใช้งานโปรโต ” ตัวเลือก หลีกเลี่ยงการใช้ “ วัตถุ.ต้นแบบ ', และ ' ฆ่าเชื้ออินพุตของผู้ใช้ ” สำหรับโค้ดที่ปนเปื้อน คู่มือนี้ได้อธิบายการป้องกันการโจมตีจากมลภาวะต้นแบบใน Nodejs