กรุณาทำให้ภาษาของคุณวิเคราะห์ / ตรวจสอบได้สำหรับคนรักษาความปลอดภัยคอมพิวเตอร์
ผู้รักษาความปลอดภัยจำเป็นต้องสามารถค้นหาช่องโหว่ในโปรแกรมก่อนที่จะจัดส่ง เป็นการดีที่เราจะถูกเรียกใช้ในช่วงต้นและสามารถแสดงความคิดเห็นใน codebase ในขณะที่มันพัฒนา แต่มักจะไม่
เมื่อเวอร์ชันภาษาใหม่หรือไลบรารี่หลักออกมาสิ่งที่ปลอดภัยก่อนหน้านี้อาจไม่:
- ไลบรารีอาจมีประสิทธิภาพมากขึ้น: เช่นตอนนี้ URL ของไลบรารีรองรับ
javascript:
- อาจมีวิธีใหม่ในการแปลงสตริงหรือไบต์เป็นรหัส: เช่น
eval
หรือดีซีเรียลไลเซชันไลบรารี่
- เทคนิคการสะท้อนภาษาอาจมีประสิทธิภาพมากกว่าเช่นการเปิดเผยตัวแปรท้องถิ่น
การเปลี่ยนแปลงใด ๆ เหล่านี้สามารถเพิ่มจำนวนสิทธิ์ที่ใช้งานไม่ได้ที่โปรแกรมมี แต่เนื่องจากจำนวนสิทธิ์ที่โปรแกรมใช้ (เมื่อจัดการกับไคลเอนต์ที่ไม่ประสงค์ร้าย) ไม่ได้เปลี่ยนไปกลุ่มการรักษาความปลอดภัยจึงยากที่จะเข้าใจ ตรวจสอบอีกครั้ง
ดังนั้นโปรดคิดเกี่ยวกับเราเมื่อออกแบบและกำหนดเวอร์ชันของภาษา ด้านล่างเป็นเคล็ดลับ:
กำหนดดั้งเดิมสองสามอย่างที่โปรแกรมสามารถย่อยสลายได้
HTML5 ไม่ดีเท่านี้ พวกเขาได้เห็นได้ชัดว่าใส่มากคิดว่าเป็นความปลอดภัยและมีคนที่ฉลาดมากบาง แต่แทนที่จะระบุองค์ประกอบโปรแกรมใหม่ ๆ เช่น<video>
ในแง่ของคนเก่าหรือสร้างสิ่งที่เป็นนามธรรมทั่วไปที่ใหม่<video>
และเก่า<img>
ทั้งสามารถระบุได้ในแง่ของ<video>
ยัง องค์ประกอบโปรแกรมแบบใช้ครั้งเดียวที่มีผลต่อความปลอดภัยของตัวเอง
ทำให้ภาษาของคุณคล้อยตามการวิเคราะห์แบบคงที่ (แม้ว่าจะไม่ได้พิมพ์แบบคงที่)
กลุ่มการรักษาความปลอดภัยมักใช้การวิเคราะห์แบบคงที่เพื่อค้นหารูปแบบและพยายามแยกส่วนของโปรแกรมออกเพื่อให้พวกเขาสามารถมุ่งเน้นไปที่บิตที่ยุ่งยาก
ควรชัดเจนว่าตัวระบุใดเป็นตัวแปรท้องถิ่นและไม่ใช่
เช่นอย่าทำผิดพลาดเหมือนกับ JavaScript รุ่นเก่าซึ่งทำให้ไม่สามารถบอกได้ว่าx
เป็นการอ้างอิงตัวแปรท้องถิ่นในด้านล่าง (อ้างอิงจากการอ่านตัวอักษรของข้อมูลจำเพาะรุ่นเก่า):
if (Math.random() > 0.5) {
Object.prototype.x = 0;
}
function f() {
var x = 1;
(function () {
alert(x); // Might alert 0, might alert 1.
})();
}
อนุญาตให้มีการรักษาความปลอดภัยในการย่อยสลาย
ระบบรักษาความปลอดภัยจำนวนมากได้รับการออกแบบรอบ ๆ เคอร์เนลที่ปลอดภัยซึ่งรักษาคุณสมบัติความปลอดภัยไว้เพื่อให้กลุ่มความปลอดภัยสามารถมุ่งเน้นความพยายามในการวิเคราะห์รหัสจำนวนเล็กน้อยและช่วยให้โปรแกรมเมอร์ส่วนใหญ่ไม่ต้องจัดการกับกลุ่มความปลอดภัย .
มันควรจะเป็นไปได้ที่จะเขียนเคอร์เนลในภาษาของคุณ หากหนึ่งในคุณสมบัติความปลอดภัยของภาษาของคุณนั่นเป็นเพียงส่วนหนึ่งของ URL ที่จะถูกดึงมาได้ผู้เขียนเคอร์เนลสามารถทำบางสิ่งบางอย่างเพื่อแชนเนล URL ทั้งหมดที่ดึงผ่านรหัสของพวกเขาได้หรือไม่? หรือตรวจสอบการสร้างคงที่ (เช่นการดูการนำเข้า) ให้บริการฟังก์ชั่นเดียวกัน
บางภาษาเช่น Newspeak ใช้โมเดลความสามารถของวัตถุ นั่นเป็นวิธีที่ยอดเยี่ยมและเป็นวิธีที่ยอดเยี่ยมในการรักษาความปลอดภัยในการย่อยสลาย
แต่ถ้าคุณทำอย่างนั้นไม่ได้การทำให้กราฟโมดูลเป็นสิ่งประดิษฐ์ที่วิเคราะห์ได้แบบสแตติกสามารถทำให้คุณได้รับประโยชน์บ้าง หากฉันสามารถพิสูจน์ได้ว่าโมดูลไม่สามารถเข้าถึงโมดูลไฟล์ I / O (ยกเว้นโดยการเรียกรหัสในโมดูลใน TCB) จากนั้นฉันสามารถออกกฎคลาสทั้งหมดของปัญหาจากโมดูลนั้น
จำกัด อำนาจของภาษาสคริปต์ฝังตัว
ระบบที่มีประโยชน์มากมายถูกจัดระเบียบเป็นแกนหลักแบบคงที่ซึ่งจะช่วยปิดโค้ดจำนวนมากที่เขียนด้วยภาษาแบบไดนามิก (แม้ใช้งานได้)
และการฝังภาษาสคริปต์สามารถทำให้ระบบขยายได้มากขึ้น
แต่ภาษาสคริปต์ไม่ควรมีสิทธิ์เต็มที่ใน VM
หากคุณเลือกที่จะอนุญาตให้ใช้ภาษาสคริปต์ฝังตัวทำให้ผู้เรียกใช้สามารถ จำกัด สิ่งที่สามารถทำได้ แบบจำลองความสามารถในวัตถุ (ดูความคิดเห็นใน Newspeak ด้านบน) มีความเหมาะสมมากที่นี่ ดังนั้นเมื่อมีการประเมินรหัสในภาษาสคริปต์โทรควรผ่านในรหัสการดำเนินการและทุกตัวแปรทั่วโลกสำหรับรหัสที่
ถือว่าeval
เป็นภาษาที่ฝังตัวเป็นภาษาสคริปต์
หากภาษาของคุณสามารถเรียกใช้คอมไพเลอร์ของตัวเองเพื่อเปลี่ยนสตริงให้เป็นรหัสได้ให้อนุญาตให้แซนด์บ็อกซ์นั้นเหมือนกับภาษาสคริปต์แบบฝังตัวใด ๆ
ใช้โมเดลการทำงานพร้อมกันง่าย ๆ
พวกเราด้านความปลอดภัยไม่ต้องการที่จะกังวลเกี่ยวกับสภาพการแข่งขันเมื่อพยายามที่จะคิดออกว่าทรัพย์สินการรักษาความปลอดภัยจะถูกเก็บไว้
โปรดพิจารณาทางเลือกในการทำเกลียวก่อนที่จะตกลงบนเธรดเป็นตัวเลือกเริ่มต้นที่แทบจะเป็นไปไม่ได้ที่จะปลอดภัย
อย่างง่ายอย่างหนึ่งคือการทำงานพร้อมกันของเหตุการณ์ลูปเหมือนที่พบใน E, Verilog และ JavaScript
อย่ากระตุ้นให้เกิดความสับสน
บางภาษาเป็นภาษาที่ใช้กาวและพวกเขาก็จัดการกับสตริงในภาษาต่าง ๆ มากมาย
ตัวอย่างเช่น JavaScript มักจะประกอบด้วยสตริงของ HTML, CSS, XML, JSON และแม้แต่ JavaScript มันยากมากสำหรับโปรแกรมเมอร์ที่จำการเข้ารหัสสตริงข้อความธรรมดาอย่างถูกต้องเมื่อรวมมันเพื่อสร้างสตริงในภาษาอื่นดังนั้นโปรแกรม JS แปลกใจมีปัญหา quoting สับสนทุกชนิด: XSS แย่ที่สุด
หากคุณต้องการรวมคุณสมบัติการรวมสตริงให้ลองลดภาระความปลอดภัยของโปรแกรมเมอร์ DSLs, แมโครที่ถูกสุขลักษณะและภาษาเทมเพลตในตัวสามารถเป็นวิธีที่ยอดเยี่ยมในการทำเช่นนี้โดยการย้ายภาระสำหรับการหลบหนีไปยังไลบรารีหรือนักพัฒนาภาษาอย่างถูกต้องและอยู่ห่างจากผู้พัฒนาปลายทาง