Будь ласка, зробіть свою мову аналізованою / підлягає аудиту для людей із комп'ютерної безпеки.
Люди з безпеки повинні мати можливість виявляти вразливості в програмі, перш ніж вона надходить. В ідеалі, ми зателефонували на початку та можемо коментувати базу коду під час її розвитку, але часто ні.
Коли вийде нова версія мовної або основної бібліотеки, попередньо безпечні речі більше не можуть бути:
- бібліотеки можуть стати більш потужними: наприклад, зараз підтримується бібліотека 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, використовують модель об'єктних можливостей. Це дивовижний і чудовий спосіб отримати безпеку для розкладу.
Але якщо ви не можете цього зробити, перетворення графічного модуля на статично проаналізований артефакт може принести вам трохи користі. Якщо я можу довести, що модуль не може дійти до модуля вводу / виводу файлу (крім виклику коду в модулі в TCB), я можу виключити цілі класи проблем із цього модуля.
Обмежте повноваження вбудованих мов сценарію
Дуже багато корисних систем організовано як статичне ядро, яке розпочинає багато коду, написаного на динамічних (навіть функціональних) мовах.
І вбудовування мов сценаріїв може зробити систему набагато більш розширюваною.
Але мова сценаріїв не повинна мати повний авторитет VM.
Якщо ви вирішите дозволити вбудовані мови скриптування, спростіть, хто вимагає обмеження того, що вони можуть зробити. Тут дуже доречна модель об'єктних можливостей (див. Коментар до Newspeak); тож при оцінці коду на мові скрипту абонент повинен передати код для виконання та всі глобальні змінні для цього коду.
Трактуйте eval
як мову, що втілює себе як мову сценарію
Якщо ваша мова може викликати власний компілятор, щоб перетворити рядок у код, тоді дозвольте йому бути пісочницею так само, як і будь-яка вбудована мова сценарію.
Використовуйте просту модель одночасності
Нам людям із безпеки не подобається турбуватися про перегони, намагаючись з’ясувати, чи зберігається безпека.
Будь ласка, розгляньте альтернативи потоці, перш ніж розташуватись на потоках, як майже неможливий для захисту варіант за замовчуванням.
Одне з простих - це паралельність циклу подій, подібна до E, Verilog та JavaScript.
Не заохочуйте цитувати плутанину
Деякі мови є клейовими мовами, і вони закінчують справу з рядками на безлічі різних мов.
Наприклад, JavaScript часто складає рядки HTML, CSS, XML, JSON і навіть JavaScript. Програмістам дуже важко пам’ятати, як правильно кодувати рядки простого тексту при їх поєднанні для створення рядків іншими мовами, тому програми JS, як не дивно, мають всілякі проблеми із заплутаністю: XSS є найгіршим.
Якщо ви хочете включити функції композиції рядків, спробуйте зменшити навантаження програміста. DSL, гігієнічні макроси та вбудовані мови шаблонів можуть бути чудовим способом зробити це, перемістивши тягар для правильного виходу на розробників бібліотеки чи мови та подалі від кінцевого розробника.