Чому уряд США забороняє динамічні мови для безпечних проектів?


120

Я знаю деяких людей, які зараз працюють над проектом для американських військових (низький рівень безпеки, дані, що не стосуються бойових ресурсів людини).

Початковий стан коду проекту було передано військовим на огляд, і вони запустили програму через якийсь інструмент аналізатора безпеки. Він повернув звіт про відомі проблеми безпеки в коді та вимагав змін, які потрібно було впровадити до доставки кінцевого продукту.

Одним із пунктів, який потрібно було вирішити, було видалення частини проекту, написаного на Ruby, оскільки це динамічна мова.

Яка передумова / причина того, що не можна використовувати динамічну мову в захищеній обстановці? Це уряд повільно сприймає нові технології? Або динамічні мови створюють додатковий ризик для безпеки порівняно зі статичними мовами (ala C ++ або Java )?


56
Єдиний спосіб точно знати - це якщо ваші знайомі запитують у своїх роботодавців причину. Але я можу ризикнути здогадом: статична перевірка типу - це ще один шар, який допомагає правильності програмного забезпечення, що критично важливе для місії. Звичайно, не вдасться позбутися від помилок, але це крок у правильному напрямку: комп’ютер виконує певну роботу за вас. (Так, я знаю, що це територія святих воєн).
Андрес Ф.


75
Ви не хочете, щоб програмне забезпечення для управління ракетами було написано на PHP + JavaScript.
Tulains Córdova

16
Дані про HR - це не "низький рівень безпеки". Я б очікував, що компанія збереже мою роботу та особисті дані максимально безпечно.
gbjbaanb

5
@gbjbaanb Я думаю, що ОП означало, що втрата людей - це не найгірший сценарій.
Андрес Ф.

Відповіді:


126

Існує ряд «акуратних» речей, які можна виконати на динамічних мовах, які можна витягнути в частинах коду, що не очевидно іншому програмісту чи аудитору щодо функціональності певного коду.

Розглянемо цю послідовність у irb (інтерактивна оболонка з рубіну):

irb(main):001:0> "bar".foo
NoMethodError: undefined method `foo' for "bar":String
        from (irb):1
        from /usr/bin/irb:12:in `<main>'
irb(main):002:0> class String
irb(main):003:1> def foo
irb(main):004:2> "foobar!"
irb(main):005:2> end
irb(main):006:1> end
=> nil
irb(main):007:0> "bar".foo
=> "foobar!"

Що там сталося - я намагався викликати метод fooу константі String. Це не вдалося. Потім я відкрив клас String і визначив метод fooo return "foobar!", а потім назвав його. Це спрацювало.

Це відоме як відкритий клас і дає мені кошмари щоразу, коли я думаю про те, щоб написати код у рубіні, який має будь-яку безпеку чи цілісність. Звичайно, це дозволяє робити якісь акуратні речі досить швидко ... але я міг би зробити це так, кожен раз, коли хтось зберігав рядок, він зберігав її у файл або надсилав по мережі. І ця невелика переосмисленість рядка може бути налаштована в будь-якому місці коду.

Багато інших динамічних мов мають подібні речі, які можна зробити. У Perl є Tie :: Scalar, який може за кадром змінити, як працює даний скаляр (це трохи очевидніше і вимагає певної команди, яку ви можете бачити, але скаляр, який передається з іншого місця, може бути проблемою). Якщо у вас є доступ до кулінарної книги Perl, знайдіть Рецепт 13.15 - Створення магічних змінних за допомогою краватки.

Через ці речі (а інші часто є частиною динамічних мов) багато підходів до статичного аналізу безпеки в коді не працюють. Perl і Нерозбірливість показує, що це так, і вказує навіть на такі тривіальні проблеми з підсвічуванням синтаксису ( whatever / 25 ; # / ; die "this dies!";ставить перед собою виклики, тому що whateverможна визначити, щоб брати аргументи чи ні під час виконання, повністю перемагаючи підсвічувач синтаксису або статичний аналізатор).


Це може стати ще цікавішим у Ruby завдяки можливості доступу до середовища, в якому було визначено закриття (див. YouTube: Зберігання Ruby Reasonable від RubyConf 2011 Джошуа Балланко). Мені стало відомо про це відео з коментаря Ars Technica від MouseTheLuckyDog .

Розглянемо наступний код:

def mal(&block)
    puts ">:)"
    block.call
    t = block.binding.eval('(self.methods - Object.methods).sample')
    block.binding.eval <<-END
        def #{t.to_s}
          raise 'MWHWAHAW!'
        end
    END
end

class Foo
    def bar
        puts "bar"
    end

    def qux
        mal do
            puts "qux"
        end
    end
end

f = Foo.new
f.bar
f.qux

f.bar
f.qux

Цей код повністю видно, але malметод може бути деінде ... і з відкритими класами, звичайно, його можна було б переосмислити десь ще.

Запуск цього коду:

~ / $ ruby ​​foo.rb 
бар
> :)
qux
бар
b.rb: 20: у `qux ': MWHWAHAW! (Помилка виконання)
    від b.rb: 30: в ``
~ / $ ruby ​​foo.rb 
бар
> :)
qux
b.rb: 20: у `барі ': MWHWAHAW! (Помилка виконання)
    від b.rb: 29: в ``

У цьому коді закриття отримало доступ до всіх методів та інших прив'язок, визначених у класі в цій області. Він обрав випадковий метод і переробив його, щоб створити виняток. (див. клас Прив'язка в Ruby, щоб отримати уявлення про те, до чого цей об'єкт має доступ)

Змінні, методи, значення self та, можливо, блок ітераторів, до яких можна отримати доступ у цьому контексті, зберігаються.

Більш коротка версія, яка показує переосмислення змінної:

def mal(&block)
    block.call
    block.binding.eval('a = 43')
end

a = 42
puts a
mal do 
  puts 1
end
puts a

Що при запуску виробляє:

42
1
43

Це більше, ніж відкритий клас, про який я згадував вище, що робить неможливим статичний аналіз. Що демонструється вище, це те, що закриття, яке передається десь в іншому місці, несе в собі повне середовище, яке було визначено в ньому. Це відоме як середовище першого класу (так само, як коли ви можете обходити функції, вони є функціями першого класу, це оточення та всі прив’язки, наявні на той час). Можна було б визначити будь-яку змінну, яка була визначена в межах закриття.

Добре чи погано, скаржиться на рубін чи ні (тобто використання , де можна було б хотів , щоб мати можливість отримати в середовищі методи (див Safe в Perl)), питання про те, «чому б рубін бути обмежений протягом урядового проекту "дійсно відповідає на це відео, пов'язане вище.

Враховуючи, що:

  1. Ruby дозволяє витягти навколишнє середовище з будь-якого закриття
  2. Ruby фіксує всі прив’язки в межах закриття
  3. Ruby підтримує всі зв'язки як живі, так і змінні
  4. У Ruby є нові прив'язки тіньових старих прив’язок (замість того, щоб клонувати середовище чи забороняти повторне пов'язування)

З урахуванням цих чотирьох варіантів дизайну неможливо знати, що робить будь-який біт коду.

Більше про це можна прочитати у блозі "Абстрактні єресі" . Конкретна публікація стосується схеми, де були такі дискусії. (пов’язано з SO: Чому схема не підтримує першокласні середовища? )

Однак з часом я зрозумів, що в першокласному середовищі виникає більше труднощів і менше енергії, ніж я вважав спочатку. На даний момент я вважаю, що першокласні середовища в кращому випадку марні, а в гіршому - небезпечні.

Я сподіваюся, що в цьому розділі показано аспект небезпеки середовищ першого класу, і чому було б запропоновано видалити Рубі із запропонованого рішення. Справа не лише в тому, що Ruby - це динамічна мова (як уже згадувалося, відповідь, інші динамічні мови були дозволені в інших проектах), але й у тому, що існують конкретні проблеми, які роблять деякі динамічні мови ще складнішими.


3
Я не розумію сенсу цього. Ви згадуєте клас Perl, який дозволяє змінювати поведінку скалярів. Однак Perl широко використовується, в тому числі в безпечних умовах. Просто наявність цих можливостей у мові не означає, що мовою не можна користуватися. У конкретному випадку Ruby, ймовірно, факт, що цільове середовище не підтримує Ruby. Особисто я ніколи не бачив Ruby, доступного для використання в будь-яких системах, і навіть не впевнений, чи є він у будь-якому затвердженому списку програмного забезпечення.
Томас Оуенс

17
@ThomasOwens - Моє розуміння цієї відповіді полягає в тому, що ключ є "many approaches to static analysis of security in code doesn't work", тому його відкидають, оскільки його неможливо проаналізувати (принаймні цією групою). Чи правильно я його трактую, чи це навіть вагома причина відхилити це, я не знаю.
Бобсон

21
Не маючи інформації у затверджених списках програмного забезпечення, я можу лише здогадуватися про труднощі з динамічними мовами. Однак я бачив подібні проблеми з фінансовим програмним забезпеченням та перевірками платіжних карток не вдається, тому що мова не могла здійснити статичний аналіз на предмет безпеки. Я продемонстрував два приклади в динамічних мовах, де природа мови дозволяє йому переривати статичний аналіз. Я також зазначив, чому це, навіть теоретично, ніколи не може бути точним. Можливо, Perl дозволено в деяких місцях, а не в інших, я можу лише здогадуватися про причини.

2
Ви можете переосмислити стандартні функції бібліотеки також у багатьох інших мовах (наприклад, Obj-C, C, C ++).
Мартін Вікман

12
Ну, методи розширення .NET НЕ такі ж, як у вищезгаданих Ruby. Вони просто створюють простіший спосіб введення статичного класу. Вони насправді не додають метод до класу.
Грем

50

Якщо припустити, що оцінка була лише захисною, а не просто скануванням прийняття (тобто вони не приймають Ruby, оскільки не хочуть підтримувати Ruby), то:

Засоби аналізу безпеки, як правило, погано проводять динамічну поведінку.

Наприклад:

Запустіть будь-який .NET проект, написаний із сучасними функціями, такими як ASP.NET MVC та Entity Framework, через щось на зразок Veracode, і подивіться, який тип білизни помилкових позитивних результатів ви отримуєте у своєму звіті.

Veracode навіть перераховує багато основних методів у базових бібліотеках .NET 4 як "непідтримувані рамки", як непідтримувані або бета-версії, навіть незважаючи на те, що більшості з них вже кілька років.

Якщо ви маєте справу з суб'єктом господарювання, який сильно покладається на такий інструмент, вони майже змушені вважати тих, хто не є небезпечним, якщо вони не мають технічної експертизи та ресурсів, щоб вручну оцінити проект і побачити, чи правильно написано і захищений.

У цивільних операціях, де комп'ютерні системи зазвичай не контролюють нічого небезпечного чи страшенно дорогого, пом'якшення полягає в тому, що ви обговорюєте помилкові позитиви, і вони загальноприйняті як такі масово.

У банківських операціях у вас все ще є шанс помилкового пом'якшення, але ви збираєтесь витратити набагато більше часу на обговорення деталей кожного пункту. Це швидко стає непосильним і ви починаєте використовувати більш традиційні методи.

У військовій, авіаційній, важкій промисловості тощо вони можуть контролювати речі, які мають жахливі режими відмов цих систем, тому вони можуть мати дуже суворі правила щодо мов, компіляторів тощо.

Організації також, як правило, пишуть свою політику безпеки в гіршому випадку, про який вони знають, тому навіть якщо ви пишете щось тривіальне, якщо ви пишете це для організації, яка має нетривіальні системи, за замовчуванням, як правило, слід її тримати більш високий стандарт, якщо хтось не вимагає конкретного винятку.


4
І це лише помилкові позитиви. Дійсно хвилююча річ - це потенціал помилкових негативів.
Стівен C

3
Чесно кажучи, мій досвід роботи з цими інструментами загалом був жахливим. Можливо, щось із 1/2001 до 1/1000 швидкості пошуку чогось насправді варто обговорити. Крім того, коли я отримую помилковий позитив, що я знаю, що щось використовується у тисячах плям у кодовій базі чи фреймворку, і це визначило це лише кілька разів, я точно не наповнений впевненістю. Проблема полягає в тому, що ви ефективно впроваджуєте негативний доказ під час створення одного з цих інструментів, якщо ви не почнете з формальної мови, наприклад spec #.
Білл

33

Динамічні мови можна використовувати в оборонних і військових програмах. Я особисто використовував та постачав Perl та Python в DoD-додатках. Я також бачив, що PHP та JavaScript використовуються та розгортаються. З мого досвіду, більшість некомпільованих кодів, які я бачив, були скриптами оболонки та Perl, оскільки необхідні середовища затверджені та встановлені на різноманітних можливих цільових системах.

Те, що ці мови є динамічними, швидше за все, не є проблемою. Перекладачі цих мов повинні бути схвалені для використання в цільових системах. Якщо інтерпретатор не затверджений для використання (або, можливо, він є, але він не розгорнутий у цільових системах), то мова не може бути використана. Використання заданого інтерпретатора (або будь-якого додатка) в захищеній системі вимагає будь-якої кількості зашкод безпеки: аналіз джерела, можливість компіляції з джерела для цільових середовищ, додатковий аналіз бінарних файлів, забезпечення відсутності конфліктів із наявною інфраструктурою тощо.


32

Я провів деякий час в інтерв'ю з Міністерством оборони (DOD), щоб написати код позиції для ММУ F-16 . Не порушуючи жодних нерозголошень: MMU - це комп'ютерний блок, який контролює майже всі функції F-16. (Очевидно) критично важливо, щоб під час польоту не виникало помилок, таких як помилки під час виконання. Не менш важливо, щоб система виконувала обчислювальні операції в режимі реального часу.

З цієї та інших історичних причин весь код цієї системи записується або компілюється в ADA, статичну об'єктно-орієнтовану мову програмування .

Через критично важливі для безпеки функції Ada, він зараз використовується не тільки для військових застосувань, але і для комерційних проектів, де програмний помилок може мати серйозні наслідки, наприклад, авіоніка та контроль повітряного руху, комерційні ракети (наприклад, Ariane 4 і 5), супутники та інші космічні системи, залізничний транспорт та банківська справа. Наприклад, системне програмне забезпечення "по електропроводі" в Boeing 777 було написано на Ada.

Я ненавиджу занадто багато цитувати, але це дуже добре пояснює, чому саме такі статичні мови (як ADA) використовуються для таких проектів:

Підтримується велика кількість перевірок часу компіляції, щоб уникнути помилок, які не виявлятимуться до часу запуску на деяких інших мовах або вимагатимуть явних перевірок до вихідного коду. Наприклад, синтаксис вимагає чітко названого закриття блоків, щоб запобігти помилкам через невідповідні кінцеві лексеми. Дотримання сильного введення тексту дозволяє виявити багато поширених програмних помилок (неправильні параметри, порушення діапазону, недійсні посилання, невідповідні типи тощо) або під час компіляції, або іншим чином під час виконання. Оскільки одночасність є частиною мовної специфікації, компілятор може в деяких випадках виявляти потенційні тупикові місця. Компілятори також зазвичай перевіряють наявність неправильно написаних ідентифікаторів, видимість пакетів, зайві декларації тощо та можуть надавати попередження та корисні поради щодо виправлення помилки.

Ada також підтримує перевірку виконання, щоб захистити від доступу до нерозподіленої пам'яті, помилок переповнення буфера, порушень діапазону, помилок один за одним, помилок доступу до масиву та інших помилок, які можна виявити. Ці перевірки можуть бути відключені в інтересах ефективності виконання, але часто можуть бути складені ефективно. Він також включає засоби, які допомагають перевірити програму. З цієї причини Ада широко застосовується в критичних системах, де будь-яка аномалія може призвести до дуже серйозних наслідків, наприклад, випадкової смерті, каліцтва або серйозних фінансових втрат. Приклади систем, в яких використовується Ada, включають авіоніку, залізницю, банківську, військову та космічну техніку.

Динамічне управління пам’яттю Ада є надійним та безпечним для типів. Ада не має загальних (і розпливчастих) "покажчиків"; також не неявно оголошує будь-який тип вказівника. Натомість, все динамічне розподілення пам’яті та розміщення операцій має відбуватися через чітко оголошені типи доступу. Кожен тип доступу має пов'язаний пул зберігання даних, який обробляє деталі управління пам'яттю низького рівня; програміст може або використовувати пул пам’яті за замовчуванням або визначити новий (це особливо актуально для неоднорідного доступу до пам'яті). Можна навіть оголосити кілька різних типів доступу, які всі позначають один і той же тип, але використовують різні пули зберігання. Також мова передбачає перевірку доступності, як під час компіляції, так і під час виконання, що гарантує, що значення доступу не може переживати тип об'єкта, на який він вказує.


3
«Через функції критичної підтримки Ada, які зараз є [використовуються] комерційними ракетами (наприклад, Ariane 4 і 5)» , звичайно, перша Ariane 5 вибухнула через програмну помилку , тому немає срібної кулі.
Ендрю Маршалл

5
@AndrewMarshall: "Хоча звіт визначив програмну помилку безпосередньою причиною, інші дослідники розглядають причини як збої в дизайні системи та проблеми управління" - я серйозно сумніваюся, що код, написаний іншою мовою (наприклад, Java або C ++), отримав би ракета на орбіту.
Мартін Шредер

@ MartinSchröder О, я не сумніваюся, що Ада все ще перевершує інших для цього додатка, просто зазначивши, що це не дурень. Інша мова могла пропустити незліченні помилки, які просто не були б можливі на Ада.
Ендрю Маршалл

13

І DoD, і NASA мають давню історію з програмовими помилками, які коштують їм мільярдів доларів. Обидві установи прийняли процеси, які повинні захистити їх від повторення однакових помилок.

Is this the government being slow to adopting new technologies?

Це неправильне уявлення - динамічні мови - це не нова технологія, вони досить старі. Проблема полягає в тому, що якщо у вас виникли проблеми, спричинені динамічною мовою (наприклад, слабким / динамічним набором тексту), і ця проблема коштувала вам великих грошей, ви могли б прийняти політику, яка б заважала вам повторити ту саму помилку - наприклад заборона використання динамічних мов у чутливих системах.

Динамічні мови часто «ковтають» помилки і закінчуються деякою несподіваною поведінкою. Це дуже небезпечно в чутливих системах. Якщо щось трапляється не так, ви хочете дізнатися це якомога швидше.

Якщо мова йде про безпеку, потрібно було б переглянути фактичний випадок використання. Наприклад, я не думаю, що веб-сторінка Ruby on Rails буде автоматично менш захищеною, ніж веб-сторінка Java.


2
IMHO більше помилок було "проковтнуто" невідкритими переповненнями буфера, ніж будь-що інше. Це саме те, що більшість динамічних мов не дозволить в першу чергу ... просто кажучи
miraculixx

@miraculixx Щоправда, є причина, чому Java / C # і подібні мови використовуються набагато більше, ніж Ruby. Вони оборонні - все перевіряють. У C / C ++ захист можна забезпечити, використовуючи хороші стандарти кодування. Ви також можете призначати перевірки на все. Але чи можете ви уявити, як написати чутливу програму в рубіні або javascript? Можливість прихованих помилок велика.
Султан

Дійсно, я можу. Ми, мабуть, погоджуємось, що програмне забезпечення потрібно ретельно перевірити, незалежно від мови програмування. Щоб уникнути регресії, тестування найкраще автоматизувати, використовуючи, наприклад, одиничне тестування, BDD та ін. Якщо припустити професійний підхід (делікатний додаток, правда?), Досягнення достатнього тестового покриття - це керований процес, не залишений випадково. З цим я сумніваюся, що C / C ++, Java мають перевагу над подібними до ruby ​​або javascript у відношенні прихованих помилок. Навички програміста? Напевно, більш технічний із C ++, сумнівний у Java, але навряд чи мова йде. Більш технічна! = Якість продукту.
miraculixx

6

Я хотів би додати до існуючих відповідей, описуючи SA-CORE-2014-005 Drupal , що є дуже критичною вразливістю, яка дозволяє вводити SQL і в кінцевому рахунку довільне виконання коду. Це спричинене динамічними правилами набору тексту та слабким режимом виконання тексту PHP.

Повний виправлення для цього випуску:

-      foreach ($data as $i => $value) {
+      foreach (array_values($data) as $i => $value) {

Цей код є частиною шару абстракції SQL, призначеного для запобігання ін'єкції SQL. Він вимагає SQL-запит із названими параметрами та асоціативний масив, який забезпечує значення для кожного названого параметра. Значення може бути масивом для таких випадків WHERE x IN (val1, val2, val3), коли всі три значення можуть передаватися як єдине значення масиву для одного названого параметра.

Уразливість виникає тому, що код передбачає, що $iв $i => $valueповинен бути цілий індекс значення. Він продовжує і об'єднує цей "індекс" безпосередньо в SQL-запит як частину імені параметра, тому що цілі числа не потребують жодного пробігу, правда?

На жаль для Drupal, PHP не надає такої гарантії. Можна передати інший асоціативний масив, клавішами якого є рядки, і цей цикл із задоволенням з'єднає рядовий ключ у запит, як це є (пам’ятайте, що код вважає, що він може бути коли-небудь цілим числом).

Хоча існують способи подібної помилки в статично набраній мові, вони малоймовірні. Хороший розробник розглядає, які можливі речі $iможуть бути, перш ніж об'єднати їх у запит. За допомогою статично набраної мови дуже просто застосувати, що це $iповинно бути цілим числом, і в такому коді, що чутливий до безпеки, це, безумовно, було б зроблено.

Крім того, код насправді перевіряє, чи є значення масивом перед ітерацією над елементами. І в цьому полягає друга частина помилки, яка забезпечує цю вразливість: і асоціативний масив, і "нормальний" масив повертаються істинними is_array. Незважаючи на те, що в C # є і словники, і масиви IEnumerable, важко побудувати код, який би зв'язав ключі словника з такими індексами, як це навмисно, не кажучи вже випадково.


2

Захищена база даних чи ні, залежить від того, як ви пишете свій код, як ви протестуєте його та як перевіряєте та контролюєте процес розробки та розгортання. Мови не є ні безпечними, ні незахищеними, так ви кодуєте.

Більшість випадків безпеки пов'язані зі зловмисним введенням (sql ін'єкції, переповнення буфера), вірусами, руткітами та троянами. Жодна мова не може захистити вас від цього.

Тож заборона класів мов бути «небезпечними» не є поважною причиною.

Я підозрюю, що хтось із будь-яких причин - поінформований чи ні - вирішив заборонити ці мови. Через деякий час це стало організаційною правдою . Можливо, це було правдою для певних проектів, але контрольні культури не прагнуть до зміни рішень (визнай, що вони були неправильними) , а вважають за краще прості правила. Вони процвітають у правилах і нормах, і не має значення, чи мають вони це сенс чи ні, саме важлива безпека має значення.

Це відбувається постійно в контрольних культурах. Я бачу це більш-менш щодня. Це не має сенсу, але так воно і йде. Якщо ви хочете прочитати більше про цю надзвичайно актуальну тему, рекомендую книгу Шнайдера " Альтернатива реінжинірингу ". Ось культурна діаграма Майкла Сахото / Агілітрікса , заснована на книзі Шнайдера: введіть тут опис зображення


18
-1 Існує багато поважних технічних причин, через які мова була б обрана для іншої (у режимі реального часу, статичного набору, перевірки виконання) для критично важливих систем безпеки. Ви маєте на увазі, що причини - це 100% культура, ми проти них, і довільні, що ІМО в цьому випадку абсолютно невірний.
Майкл Джаспер

8
"Мови ні захищені, ні незахищені" - див. Stackoverflow.com/a/14313277/602554 . Деякі мови, безумовно, "більш безпечні", ніж інші.
Майкл Джаспер

2
Моя відповідь оновлена, можливо, на ваш смак. Я все ще вважаю, що наскільки безпечною є система, це залежить більше від коду, який ви пишете, ніж того, якою мовою ви користуєтесь, хоча деякі мови допомагають уникнути певних проблем (хоча, можливо, вводить інші).
Мартін Вікман

2
@MartinWickman: а) ін'єкції SQL / HTML та переповнення буфера вирішуються деякими типами систем - у вас є різні типи для вхідного та нерозмірного введення, щоб ви знали, до кого слід звертатися. б) не всі питання безпеки в "захищених проектах" обов'язково означають компроміс. Я не хочу, щоб у програмного забезпечення, що працює під управлінням літака, була помилка, навіть якщо це не проблема "безпеки" (тобто не може бути використана для переймання системи).
Maciej Piechotka

5
-1 для проблем фактичної точності. Експлуатування переповнення буфера - проблема, яка є дуже специфічною для мови C; ви ніколи не чуєте про них мовами, які не дозволяють виділити буфер рядків у стеці. І зовсім не складно уявити гіпотетичний діалект SQL, в якому використання параметрів було не просто дозволено, а потрібно . Введення SQL було б неможливим цією мовою. Так, так, правильно розроблена мова може захистити вас від декількох поширених типів атак.
Мейсон Уілер

2

Наскільки я можу сказати, офіційна політика Міністерства оборони взагалі не забороняє динамічні мови.

Стандарти програмного забезпечення, розроблені або закуповані Міністерством оборони, оприлюднюються Агенцією оборонних інформаційних систем (DISA). Їх безпека прикладних програм - Посібник із безпеки та розвитку безпеки Посібник із технічної реалізації (STIG) не забороняє будь-якої конкретної мови. У ньому не згадується Рубі, але він згадує Perl та Python, які є аналогічно динамічними. Він згадує їх у контексті різних тем (дотримуючись встановлених стандартів кодування, уникаючи уразливості введення команд тощо).

Можливо, те, що ви бачите, є надто суворим інструментом сканування (є кілька різних згаданих у STIG, кожен може мати своє трактування правил) та / або надмірно сувора інтерпретація його результатів.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.