Есть ли языки программирования предназначен для надежности от взлома?
Другими словами, приложение может быть взломан из-за сломанного реализации, хотя конструкция идеально подходит. Я'м глядя, чтобы снизить риск разработчика неправильно реализует спецификацию.
Например
Идея неплохая, но не произошло бы, если б язык мог защититься от буфер за чтения.
SQL-инъекции, может не произойти, если бы был язык насильственных методов кодирования/декодирования данных HTML
Конфиденциальные данные могут быть сохранены в файлы подкачки в некоторых языках, где низкий уровень контроля надежно стирание памяти арен'т доступны.
Вопросы указатель/переливы возникают чаще в C по сравнению с управляемым кодом
Численным ошибкам округления могут возникнуть при использовании застройщик использует неправильный тип данных для неправильных данных.
Отказ в обслуживании может быть уменьшена, если приложение правильно многопоточный
Подписании кодекс РФ может снизить угрозу вопросы безопасности во время выполнения (Ссылка, Ссылка)
Вопрос
Редактировать: Много людей обратились к переполнения буфера вопроса, или сказать, что программист отвечает за безопасность. Я'м просто пытаюсь получить представление, если существует языки, основная цель которых была оказывать себя в безопасности, насколько это возможно и разумно. То есть, некоторые языки имеют особенности, которые делают их явно больше (или меньше) безопасна, чем большинство других языков?
На самом деле языки степени являются и"безопасной" с учетом переполнения буфера. Что нужно для языка, чтобы быть "безопасной" в этом отношении является сочетание: строгий видах, систематическое массива связаны проверок, а также автоматическое управление памятью (и "сборщик мусора, то"). Смотрите этот ответ для деталей.
Несколько старых языков не на "Безопасные" в этом смысле, в первую очередь C (и C++), а также Форт, Фортран... и, разумеется, сборке. Technically, можно написать реализацию на C, которая может быть "Безопасный" и до сих пор формально соответствует стандарту, но по крутой цене (например, вы должны сделать бесплатно()` без операции, так что выделенной памяти выделено на "вечно и"). Никто не делает это.
на "Безопасные" и языки (касаемо переполнения буфера) включает в себя Java, C#, в данные, используемые, питон, Перл, идти, даже на PHP. Некоторые из этих языков более чем достаточно эффективной для реализации SSL/TLS в (даже на встраиваемых системах, я говорю из опыта). Хотя possible написать безопасный код на C, это займет (много) концентрация и мастерство, и опыт показывает, что это трудно, и что даже самые лучшие разработчики не могут делать вид, что они always применить требуемые уровни концентрации внимания и компетентности. Это унизительно опыт. Утверждение, что "Дон'т использовать C, это опасно!" это непопулярно, не потому, что было бы неправильно, но, напротив, потому что оно верно: это заставляет признать, что они не могут быть полубоги программирования, они считают, глубоко в их души.
Заметим, однако, что эти "по гарантии" и языки Дон'т допустить ошибку: переполнение буфера-прежнему нежелательного поведения. Но они содержат повреждения: в памяти за пределами буфера фактически не считываются или записываются; вместо этого, оскорбительный поток вызывает исключение, и (обычно) прекращено. В случае с Heartbleed, это позволило бы избежать ошибок стать vulnerability и это могло бы помочь не допустить полномасштабной паники, которую мы наблюдали в последние несколько дней (на самом деле никто не знает, что делает случайную уязвимость вирусный как на YouTube видеоролик, в котором корейский невидимой лошади; но, как "логически" и, если бы не была уязвимость, то это следовало бы избежать всей этой трагикомедии).
<ч />
Редактировать:, поскольку он был обильно обсуждали в комментариях, я думал о проблеме безопасного управления памятью в C, и есть то решение, которое до сих пор позволяет бесплатно () работать, но есть чит.
Можно представить себе компилятор C, который производит и"жирный указатели на". Например, на 32-разрядной машине, сделать указатели 96-разрядных значений. Каждый выделенный блок будет предоставлен уникальный 64-битный идентификатор (скажем, счетчик), и структуру внутренней памяти (хеш-таблицы, сбалансированное дерево...) поддерживается, который ссылается на все блоки по ID. Для каждого блока, его длина также записывается в структуре. Затем значение указателя является конкатенации идентификатора блока и смещение внутри этого блока. Когда после указателя, блок расположен по ID, смещение по сравнению с длиной блока, и только тогда будет доступ к исполнении. Эта установка решает дважды бесплатно и использовать после освобождения. Он также обнаруживает переполнение буфера степени (но не все: буфер может быть частью большей структуры, и функция malloc()
/бесплатно()
управления видит только наружные блоки).
В "чит" это в "уникальный 64-битный счетчик и". Это верно только до тех пор, как вы Дон'т бежать из 64-битных целых чисел; кроме того, необходимо повторно использовать старые значения. 64 бит должны избегать этого вопроса на практике (это займет лет, чтобы "обтекать", У), но меньшего размера счетчика (например, 32 бита) может оказаться проблемой.
Также, конечно, накладные расходы на доступ к памяти может быть незначительным (довольно много физических чтений для каждого доступа, хотя в некоторых случаях может быть оптимизирован подальше), и удвоение указатель размер предполагает увеличение памяти тоже за указателем структуры. Я не в курсе любой существующий компилятор C, который применяет такую стратегию; это чисто теоретический прямо сейчас.
На языке Ада предназначен для предотвращения типичных ошибок программирования, насколько это возможно и используется в критически важных системах, где система ошибка может иметь катастрофические последствия.
Несколько примеров, где Ада выходит за рамки типичных встроенная система безопасности, предоставленной другими современными языками:
Целочисленный тип диапазон позволяют определить допустимый диапазон для типа integer. Любое значение за пределами этого диапазона будет бросать исключение (на языках, которые не поддерживают тип диапазон, ручной проверки должны быть выполнены).
:=
присвоения =
для проверки равенства. Это позволяет избежать распространенной ловушки в языках, которые используют =
для присваивания и = = для равенства присвоения случайно, когда была проверить равенство означает (в аду, случайное назначение не компиляции).
В
и из
параметров, которые определяют, является ли метод параметр может быть считан или записан
помогает избежать проблем с заявление групповом уровнях отступа (например, недавний яблочная ошибки SSL) из-за использования конец
сайта
договоры (с Ада-2012, и ранее в подмножество СПАРК) позволяют методов, чтобы определить предусловия и постусловия, которые должны быть удовлетворены
Есть еще примеры того, как Ада была разработана для безопасности представленной в безопасной и надежной буклет (формат PDF).
Конечно, многие из этих проблем могут быть устранены путем правильного стиля написания кода, проверка кода, модульных тестов и т. д. но их на уровне языка означает, что вы получаете его бесплатно.
Также стоит добавить, что несмотря на то, что язык предназначен для обеспечения безопасности, таких как Ада снимает многие классы ошибок, еще ничто не мешает вам от создания бизнес-логики, ошибок, которые язык не'т знаю ничего об.
Большинство языков программирования более высокого уровня, чем C гораздо более безопасно, когда дело доходит до ошибки программирования, как Heartbleed'ов. Примеры, что в первую очередь компилировать в машинный код включает в себя D, Rust и Ада. Это's не интересно говорить только о безопасности памяти, на мой взгляд.
Вот список дополнительных возможностей языка программирования, который (я думаю) сделать это гораздо труднее писать небезопасный код. Первые пять функций расширять компилятор'возможности в рассуждения о коде, так что вы, человек склонен делать ошибки, Дон'т придется*. Кроме того, эти функции также должны сделать его проще для людей, аудитор, рассуждать о коде. В OpenSSL'исходный код с часто описывается как беспорядок и язык строже, чем с мог бы помочь, чтобы сделать его проще. Последние две характеристики являются о контексте проблем, которые влияют на безопасность.
Из моего ограниченного знания языка, ни языка не все такие. Ржавчина - это пример языка, который охватывает многие - это строгий, неизменяемый по умолчанию, ограничен опасностями, не требует сбора мусора и довольно производительный и портативный. Время компиляции проверка порчи и зависимых типов в настоящее время представляется экзотические функции, которые требуют либо дополнительных инструментов статического анализа кода или новые языки, К сожалению.
* См. также: официальная проверка
В общем духе того, что вы'вновь прошу, я думаю, что Е язык (в "защищенных распределенных чисто-объект платформы и P2P скриптовый язык с") довольно интересная, в том, что она пытается надежно предлагают функции/расчет моделей не предоставляется.
Все текущие (имеется в виду все же обновляются) языки программирования предназначены для собственной безопасности, недостатки, насколько это возможно, но в конце дня он'ы (почти всегда) программист, который отвечает за безопасность недостатки, а не языком он'с помощью.
Редактировать: как @DCKing отметил, что не все языки равны, и я'м не говорю, что это's не хорошая идея, чтобы выбрать один наугад и попробовать и заставить его работать. Я говорю, что (очень) талантливых программистов может сделать программа так же безопасен, как семантически идентичные программы, написанной на языке более высокого уровня. Моя точка зрения заключается в том, что мы должны признать, что некоторые языки легче совершать ошибки, но также знаю, что в конце концов это'ы программист'с ошибкой, а не языком's (с некоторыми исключениями)
Нет такого понятия, как безопасный язык. Если язык обеспечивает достаточный уровень безопасности для вашей проблемы во многом зависит от проблемы, которую вы пытаетесь решить. Например, если вы пишете веб-приложения безопасности большинстве языков, используемых в данном контексте (например, Java, PHP и JavaScript с... добавьте ваши любимые) достаточно, чтобы предотвратить такие вещи, как переполнение буфера, но даже более строго типизированных языках Дон'т предлагаем присуща поддержка веб конкретные вещи, например, что делает невозможным или, по крайней мере, трудно представить межсайтовых ошибки или похожие. И нет языков будет защищать вас от плохой модели доверия, как доверчивые ДНС сервера (ДНС привязки и т. д.), текущих ПКИ модель или в том числе третьей стороны (например, вне вашего контроля) скрипты в код веб-приложения (как правило, рекламу или Google аналитики).
Поэтому выбор правильного языка может помочь вам немного, но ведь это не волшебный меч безопасности.
Помните, что для большинства языков программирования, вам не придется беспокоиться о безопасности два языка. Там'ы язык вы'вновь действительно помощью, а тут'ы язык, компилятор или интерпретатор пишутся, которая часто отличается. (Технически, там'с третьей, которая является микрокод самого процессора.) Проблема безопасности в either из этих языков может сделать вашу программу небезопасной.
Во-первых, вы не на самом деле писать программы на языках программирования. Вы пишите инструкции для компилятора, который описать какую программу вы хотите, и компилятор создает программу в своей собственной манере, которая, будем надеяться (если ваш компилятор это хорошо продуманные) сделать то же самое, что исходный код описывает. Все программы, когда они работают, находятся в "языка" ПО - это ряд чисел, которые интерпретируются определенным образом при загрузке в оперативной памяти и поступают в ЦП. Машинный язык не предназначен с устойчивость к взлому в виду, так что не язык, который компилируется может быть действительно на "стойкие" до взлома, потому что программа в любом случае будет в машинный язык. Любой интерпретируемый или ВМ язык будет по-прежнему работать в родной рамки, которая в конечном итоге компилируется в машинный язык, поэтому эта проблема сохраняется.
Во-вторых, большинство реальных языков являются полными Тьюринга. Это означает, что любая задача, которая может быть выполнена одним из них может быть достигнуто всеми. Таким образом, вы не можете сделать на "взлома" и невозможно (если взлом означает написание вредоносных программ); это нарушило бы Тьюринг полноты.
Это'ов стоит уточнить на данный момент, что вы подразумеваете под взлома. Поскольку вы упоминаете идея неплохая, но, я думаю, вы не'т имею в виду это в Столмен'ы смысле (на"игривый мастерить-то").
Если вы имеете в виду людей, которые пишут программы, которые напрямую обращаться к памяти и кражи данных, либо изменить другие программы (такие как вирусы и кейлоггеры), то это не проблема языка может действительно дело. Компилятор может помочь, имея дополнительные функции, чтобы произвести машинный код обфусцирован при компиляции, но в конце концов это's все еще возможный для умелого хакера памяти, чтобы найти свой путь вокруг. Решение этой проблемы является дизайн операционная система: операционная система должна песочницу программ, и не позволять одной программе, возиться с памятью, которая относится к другой программе. Это часть того, что UAC в Windows делает (хотя Sandboxie это лучший пример).
Есть один нюанс здесь: некоторые языки, вроде C# или Java имеют возможности (точнее, компилятор и виртуальная машина, что программы выполняются внутри функции), что проверить, является ли какая-либо программа пытается гадость про другой программой'ютером, и когда это произойдет, скинуть ошибки, как IllegalAccessException
(например, keylogger.exe не уметь читать
Credit_card_numberзначение
интернет-банкинг application.exe). Конечно, это требует отслеживания того, что память относится к тому, что программа, которая имеет некоторые нетривиальные производительности и затрат. Какая-то "проще" в таких языках, как C Дон'т иметь его - это-то, почему много писак как вирусы пишутся С. В наше время вы должны быть умными о том, чтобы обойти контроль учетных записей, но еще во времена Windows 98 человек мог делать всякие сумасшедшие вещи для вашего компьютера/операционной системы на чтение и запись в память, они были'т должен. Обратите внимание, что даже в C# у вас еще есть возможность использовать нормальный, С-как указатели (которые на язык называет "небезопасными" и требует, чтобы отметить в качестве таковых в РФ), если хочешь - хотя CLR будет, вероятно, содержать свой Хак в себе, если вы не найдете дыру в безопасности в CLR, которая позволяет тоннеля в остальной памяти. Второй вид взлома эксплуатируя ошибку в существующую программу. Эта категория разработки принадлежит. При этом вопрос, Является ли программист ошибется или нет. Очевидно, если ваш язык-это что-то вроде на Brainfuck или Perl, который очень трудно читать, вполне вероятно, что вы будете делать ошибки. Если это язык со многими, что "попался"и как в C++ (см. фильм "классический"
в случае, если (i=1)и
если (я==1)` или C запутывания конкурса), то это может быть трудно, чтобы поймать ошибки. В этом смысле проектирование для безопасности это очень просто тривиальный частный случай проектирования для минимизации ошибки программиста.
Обратите внимание, что ошибка Heartbleed, то ли сознательное вредительство или недоразумение, была проблема с алгоритм использовать (автор на "забыл", чтобы проверить размер) - так нет компилятора короткий ИИ такой умный, как очень умного человека, возможно, надеются обнаружить это; несмотря на то, в результате нарушения прав доступа, предположительно, мог быть пойман с какой-то умной управления памятью.
Есть два рода опасения по поводу взлома:
Существует много безопасных языках. Я бы сказал, что язык с управлением памятью и потокобезопасность, как язык может сделать.
Однако, большинство из них являются неэффективными. Вывоз мусора стоит дорого, и интерпретируемые языки программирования более. И что's, почему большие приложения по сей день записываются в памяти-опасные Си/Си++.
Я'вэ недавно играл с ржавчина, и мне кажется, что "безопасной" и язык в том смысле, что он был частично предназначен для этого.
Это'ы компилируемых языках, таких как C++, а также указатели и параллелизма. (Сборщик мусора не надо)
Однако, это не'т ушка сохранность памяти, указателей и параллелизма с ним. Rust-это язык, который не'т доверять программисту, и во время компиляции проверяет подозрительные использования указателей. Существует несколько kinds указателей/ссылок (заемные, принадлежит, и т. д.), и некоторые из них имеют строгие правила о них. Например, нельзя:
Есть подобные правила, обеспечивающие безопасность потока. При желании, они могут обойти многие из этих проверок с помощью небезопасна боксы ("и поверьте мне, я знаю, что я'делаешь мне м&;), или медленное мусора указатели. Есть и более простое (и эффективных) способов сделать это с помощью клонов и ссылки, которые меняются по мере изменения использования.
Управляемый тип безопасный языков сделать многое для предотвращения такого рода вещи путем обеспечения проверки типов автоматически и перемещения выполнение кода дальше от процессора сама по себе, однако это вовсе'т исключает возможность ошибок в реализации системы языка использует карту к процессору (например, CLR в .Net или в JVM в Java). Он также не'исключается возможность ошибки в приложении, которые могли бы вызвать его, чтобы быть уязвимы для манипуляций или утечки данных для себя.
Они действительно улучшают безопасность системы довольно значительно, но они также тяжелее, медленнее и более ограничен в своих действиях из-за расходов на механизме исполнения они должны работать через, чтобы обеспечить такую возможность.
Есть, конечно, языки, которые были разработаны, чтобы быть безопасной, но никто не совершенен. Например, Ада позволяет указать допустимого диапазона для целых переменных и бросает исключение, если они когда-нибудь пойти вне этого диапазона. Звучит хорошо, спасла тебя от необходимости проверять вручную. Проблема в том, если вы не'т придется вручную проверить это легко установить этот механизм, а потом забудьте рассмотреть последствия, т. е. целое число исключений диапазона. Вы просто создали вектор для атак отказа в обслуживании.
Безопасность-это процесс. Язык может помочь, но в лучшем случае он может только снизить вероятность ошибки в процессе, как правило, создает новые и часто даже более тонкие. Возможно С, по характеру бытия более легким, чтобы полностью понять и в полной мере детерминированные операции (без фонового сбора мусора, например), идеально подходит для написания безопасного кода. И конечно, когда вы смотрите на большое критический код безопасности это записано В С. Чтобы быть справедливым в аду, это больше о надежности, чем безопасности.