понедельник, 9 мая 2016 г.

Цена ошибки в 7 миллиардов долларов


Ракета Ариан-5 ценой 7 миллиардов долларов, запущенная 4 июня 1996 года, отклонилась от курса и разрушилась через 40 секунд после запуска. Отказ был вызван тем, что в бортовом компьютере произошло переполнение 16-разрядных регистров, после которого компьютер вышел из строя. Программное обеспечение Ариан-5 было тщательно протестировано, но на ракете Ариан-4. Однако новая ракета имела двигатели с более высокими скоростными параметрами, которые, будучи переданными бортовому компьютеру, и вызвали переполнение регистров. (Фото: ESA/CNES/ARIANESPACE- Service Optique CS6)

Цифровая схемотехника и архитектура компьютера

вторник, 9 февраля 2016 г.

Политики о политике

В прошлом сообщение была упомянута книга "Fuzzing: Brute Force Vulnerability Discovery", она замечательно не только тем, что дает хорошее вводное представление о фаззинге, но и своими эпиграфами к главами. 

Станет ли меньше дорог Интернета?
Джордж Бушш мл.,
29 января 2000года


Меня перенедооценили.
Джордж Бушш мл.,
Бентонвилль, Арканзас,
6 ноября 2000 года


Слишком много хороших документов остается без дела. Слишком много мужчин
по всей стране не могут любить женщин.
Джордж Бушш мл.,
ПопларрБлафф, Монтана,
6 сентября 2004 года


Моя работа– думать на перспективу.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
21 апреля 2004 года


Вы учите ребенка читать, и он или она сможет пройти тест на грамотность.
Джордж Бушш мл.,
Таунсенд, штат Теннесси,
21 февраля 2001 года


Наши противники изобретательны инаходчивы– мы тоже. Они все время думают о том, как еще можно навредить нашей стране и людям нашей страны, – мы тоже.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
5 августа 2004года


Все эти вопросы международной безопасности уже немного надоели. 
Джордж Бушш мл.,
цитата из New York Daily News,
23апреля 2002 года


Это оружие массового поражения где-то должно быть!
Джордж Бушш мл., 
Вашингтон, округ Колумбия, 
24 марта 2004 года


В небольших ожиданиях я специалист.
Джордж Бушш мл., 
речь на борту «ЭйрФорс-1», 
4 июня 2003 года


Самое важное для нас сейчас – найти Усаму бен Ладена. Это наша задача номер один, и мы не успокоимся, пока не отыщем его.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
13 сентября 2001 года


Я не знаю, где сейчас бен Ладен. Понятия не имею и иметь не хочу. Это не так уж важно. Это не наша забота.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
13 марта 2002 года


При диктатуре все было бы куда проще–только если бы диктатором был я.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
19 декабря 2000 года


Я начальник– и мне не нужно ничего объяснять. Мне не нужно объяснять, почему я говорю то, что я говорю. В этом смысле президентом быть интересно.
Джордж Бушш мл.,
цит. по книге Б.Вудворда
«Bush at War» (Буш на тропе войны)


В интересах нашей страны найти тех, кто представляет для нас угрозу,
и свернуть их с вредного пути. 
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
28 апреля 2005 года


У меня есть лесозаготовительная компания? Это для меня новость. Древесина нужна?
Джордж Бушш мл.,
вторые президентские дебаты,
Сент-Луис, штат Миссури,
8 октября 2004года


Думаю, все мы согласны, что прошлое прошло.
Джордж Бушш мл.,
встреча с Джоном Маккейном,
Dallas Morning News,
10 мая 2000 года


Не могу представить, чтобы кто-нибудь, вроде Усамы бен Ладена, смог понять
всю радость от праздника Хануки.
Джордж Бушш мл.,
церемония зажжения меноры в Белом Доме,
Вашингтон, округ Колумбия,
10декабря 2001 года


Я подметил одну закономерность: ожидания обычно больше того, чем то, что мы ждем.
Джордж Бушш мл.,
Лосс-Анджелес,
27 сентября 2000 года


Природный газ полусферичен. Мне нравится считать его полусферичным,
потому что мы можем найти его по соседству.
Джордж Бушш мл.,
Вашингтон, округ Колумбия,
20 декабря 2000 года


Он белый.
Джордж Бушш мл.,
на вопрос британского мальчика о том,
как выглядит Белый Дом,
19 июля 2001года


Я слышал, в интернетах ходят слухи о том, что мы собираемся ввести военный призыв.
Джордж Бушш мл.,
вторые президентские дебаты,
СенттЛуис, Миссури,
8 октября 2004 года


Есть старая поговорка в Теннесси – я знаю, это выражение есть в Техасе, наверное, оно есть и в Теннесси: одурачь меня один раз, и стыдно–стыдно должно быть тебе. Одурачь меня еще раз–и тебя не смогут больше никогда одурачить.
Джордж Бушш мл.,
Нэшвилл, Теннесси,
17 сентября 2002 года


Ну, я думаю, что если вы говорите, что собираетесь что-то сделать и не делаете,
то это достойно уважения.
Джордж Бушш мл.,
онлайннчат CNN,
30 августа 2000 года


Я больше не хочу давать в Вашингтоне объяснения, которых не могу объяснить.
Джордж Бушш мл.,
Портленд, штат Орегон,
31 октября 2000года


Часто задается вопрос: а учатся ли наши дети?
Джордж Бушш мл.,
Флоренс, Южная Каролина,
11 января 2000года


Так или иначе, для нас с Лорой это был сказочный год.
Джордж Бушш мл.,
подводя итоги первого года президентства
спустя3 месяца после 11 сентября.
Вашингтон, округ Колумбия,
20 декабря 2001 года

[1] http://www.ozon.ru/context/detail/id/4839451/

О файззинге

Что такое файззинг?


Файззинг - техника тестирования программного обеспечения, главная образом связанная с отправкой приложению случайные или специально сформированные (сгенерированных) данных. Главными целями проверки являются обнаружение брешей в безопасности продукта и выявления ошибок в логике условий. 

Данная техника может быть использована широким кругом специалистов - экспертами по безопасности в качестве выявления уязвимостей, инженерами по качеству для нахождения критичных ошибок (например связанных с падение программ), разработчиками для выявления утечек памяти и переполнения стека.

Немного примеров

Простой пример файззинга

import sys

if __name__ == "__main__":
    key, value = sys.argv[1], sys.argv[2]

>>> python arg.py --key
Traceback (most recent call last):
  File "arg.py", line 5, in <module>
    key, value = sys.argv[1], sys.argv[2]
IndexError: list index out of range


Пример фаззинга переменных среды

import os
if __name__ == "__main__":
    path = os.path.split(os.path.getenv("HOME"))[0]

>>> python env.py
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
IndexError: tuple index out of range


На выявление каких ошибок нацелен файззер?

Ошибки контроля доступа. Выявление несанкционного доступа.
Ошибки в логике. Вызов сбоя программ при отправлении некорректных данных (например, бесконечная обработка одного сообщения), проверка граничных значений и проч. 
Повреждение памяти. Переполнение стека и хипа, DoS веб-серверов,  и т.д.


Где можно использовать?


Фаззинг переменной среды и фаззинг аргументов коммандной строки

Локальный тип фазинга, нацеленный на тестирование программы, которая находится на той же машине где проводится тестирование. В качестве некоррекных входныъ данных (векторов) используютя либо переменные окружения, используемые программой в процессе своей работы, либо аргументы командной строки самой программы.


Фаззинг сетевого протокола

В данную группа объектов, подвергаемых фаззингу подпадает практически все компоненты OSI (Open Systems Interconnection Basic Reference Model)-модели (за исключением пожалуй только физического уровня).

Например, на сетевом уроне, в качестве входных данных могут выступать измененные TCP-пакеты. На сессионном уровне фаззингу чаще всего пожалуй подвергался RPC.


Фаззинг веб-приложений и серверов

Особый вид сетевого файззинга, нацеленый на нахождение дефектов и уязвимостей  в веб-приложениях или компонентах инфраструктуры (например БД). Примером таких приложений могут выступать электронная почта, сайты, форумы и проч.

В качестве векторов ввода некорректных данных чащевсего выспупают
HTTP-протокол. Причем файзингу пдаются все его компоненты - заголовки, методы, доп. атрибуты.
Cookies. Файззят ключи, значения, с дальнейшем отправление запроса на сервер с использование локальных куков.
URI. Под фаззинг попадают ключи и значания в GET-запросах 

Для начала про уязвимости советую почитать [1]


Фаззинг формата файла

Cпециальный метод фаззинга конкретно указанных объектов. Как правило, этими объектами являются клиентские приложения, например медиаплееры, веб-броузеры и офисные пакеты приложений. Тем не менее, объектами могут быть и сервееры, например сканеры антивирусных шлюзов, спам-фильтры и даже обычные серверы электронной почты. Конечная цель фаззинга формата файла – обнаружить уязвимое звено в процессе парсинга определеннного типа файла, осуществляемого приложением.


Фаззинг оперативной памяти

Фаззинг, направленный на изменение или подмену поведения исполняемой программы.
Известно два способа фаззинга

Mutation Loop Insertion (MLI) - это может быть изменение поведение одной из исполняемых инструкций программы во время выполнения.
Snapshot Restoration Mutation (SRM) - методика похожа на MLI, но не менет исполняемые инструкции, а вносит мутации во входные и ввозвращаемые данные, воздейтсвуя на работоспособность программы.


Источники

Если есть желание более подробно ознакомиться с техниками фаззинга предлагаю ознакомиться со следующими источниками.

[1] http://www.amazon.com/gp/product/0321446119
[2] http://www.openrce.org/articles/
[3] http://www.fuzzing.org/
[4] https://xakep.ru/2010/07/19/52726/
[5] https://en.wikipedia.org/wiki/Fuzz_testing
[6] http://www.vr-online.ru/?q=content/fuzzing-tehnologija-ohoty-za-bagami-752

На русском можно найти перевод книги "Fuzzing: Brute Force Vulnerability Discovery"

четверг, 4 февраля 2016 г.

Различайте понятия критичности и приоритета дефекта

До сих пор встречаются наивные люди, которые думают что это одно и тоже.

Слово Сэму Канеру:
Различайте понятия критичности и приоритета дефекта.
Критичность относится к влиянию и последствиям дефекта. Приоритет показывает, когда ваша компания собирается его исправить. Критичность не изменится, если вы узнаете больше о скрытых взаимосвязях. Приоритет меняется вместе с развитием продукта. Как правило, большинство критичных дефектов имеют высокий приоритет, минорные и косметические проблемы имеют приоритет низкий. Тем не менее, это не одно и то же. Критичные проблемы могут не стоить исправления — например, вы нашли ошибку, которая приведет к повреждению любой новой записи, созданной до декабря 1999. Эта ошибка была бы приоритетной несколько лет назад (когда декабрь 1999 был датой из будущего), она и сейчас остается серьезной, но многие компании не стали бы ее исправлять. 
С другой стороны, перевернутое лого на стартовом экране вашего приложения является чисто косметической ошибкой. Тем не менее, большинство компаний сочтут этот баг высокоприоритетным.
[1] Оригинал
[2] Перевод дернул здесь

пятница, 29 января 2016 г.

HTTP

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


Соединение (connection)
Виртуальный канал транспортого уровня, установленный между двумя программами с целью связи.

Сообщение (message)
Основной модуль HTTP связи, состоящей из структурной последовательности октетов, соответствующих синтаксису, определенному в разделе 4 и передаваемых по соединению.

Запрос (request)
Любое HTTP сообщение, содержащее запрос, определяемый в разделе 5.

Ответ (response)
Любое HTTP сообщение, содержащее ответ, определяемый в разделе 5.

Ресурс (resource)
Сетевой объект данных или сервис, который может быть идентифицирован URI, определеляемым в разделе 3.2. Ресурсы могут быть доступны в нескольких представлениях (например на нескольких языках, в разных форматах данных, иметь различный размер, иметь различную разрешающую способность) или различаться по другим параметрам.

Клиент (client)
Программа, которая устанавливает соединения с целью посылки запросов.

Агент пользователя (user agent)
Клиент, который инициирует запрос. Как правило браузеры, редакторы, роботы (spiders), или другие инструментальные средства пользователя.

Сервер (server)
Приложение, которое слушает соединения, принимает запросы на обслуживание и посылает ответы. Любая такая программа способна быть как клиентом, так и сервером; наше использование данного термина относится скорее к роли, которую программа выполняет, создавая специфические соединения, нежели к возможностям программы вообще. Аналогично, любой сервер может действовать как первоначальный сервер, прокси-сервер, шлюз, или туннель (tunnel), изменяя поведение, основываясь на характере каждого запроса.

Прокси-сервер (proxy)
Программа-посредник, которая действует и как сервер, и как клиент с целью создания запросов от имени других клиентов. Запросы обслуживаются прокси-сервером, или передаются им, возможно с изменениями. Прокси-сервер должен удовлетворять требованиям клиента и сервера, согласно этой спецификации.

Шлюз (gateway)
Сервер, который действует как посредник для некоторого другого сервера. В отличие от прокси-сервера, шлюз получает запросы в качестве первоначального сервера для запрошенного ресурса; клиент запроса может не знать, что он соединяется со шлюзом.

Туннель (tunnel)
Программа-посредник, которая поддерживает соединение. Один раз созданный, туннель не рассматривается как часть HTTP связи, хотя туннель, возможно, был инициализирован запросом HTTP. Туннель прекращает существовать, когда оба конца соединения закрываются.

Кэш (cache)
Локальная память, в которой программа хранит сообщения ответов, и в которой располагается подсистема, управляющая хранением, поиском и стиранием сообщений. Кэш сохраняет ответы, которые могут быть сохранены, чтобы уменьшить время ответа и загрузку сети (траффик) при будущих эквивалентных запросах. Любой клиент или сервер может иметь кэш, но кэш не может использоваться сервером, который действует как туннель.


[1] https://tools.ietf.org/html/rfc2616
[2] http://www.lib.ru/WEBMASTER/rfc2068/

воскресенье, 24 января 2016 г.

О безопасности

...может оказаться, что вы в последнюю минуту перед запуском впадете в панику, потому что никто даже в общих чертах не проверил надежность вашего продукта, который обошелся в $50 млн. О безопасности на протяжении жизненного цикла разработки программного обеспече ния (software development lifecycle, SDLC) слишком часто вспоминают в последнюю очередь. В итоге приходится в спешном порядке добавлять новые функции, а сроки сдачи уже не за горами. Безопасность должна быть «встроена», а не «пристроена», иначе безопасных программ не получится.



суббота, 2 января 2016 г.

Стратегии тестирования

Рекс Блэк, Росс Коллард, Сем Канер, Кэти Айберли, Камеш Пеммараджу о стратегиях тестирования:
Исчерпывающая. Тестируйте все, как можно полнее.

Вынужденная. Тестируйте что угодно и где угодно; распределяйте работы по тестированию на весь продукт.

Охота за ошибками. Используйте профили, систематизацию ошибок и интуицию, чтобы нацеливать тестирование на те места, где водятся ошибки.

Список контрольных вопросов. При тестировании руководствуйтесь списками контрольных вопросов, созданными в течение определенного времени.

Управляемая программистами. Тестируйте согласно указаниям программистов и рассматривайте их как высший авторитет на предмет правильных действий.

Управляемая заказчиками или пальзователями. Тестируйте в соответствии с тем, что, по мнению людей, оплачивающих систему, или экспертов в данной отрасли, которые будут использовать систему, нуждается в тестировании.

Управляемая реализацией. Изучайте архитектуру, код, схемы системы и т.п., чтобы определить, на чем сконцентрировать внимание при тестировании.

Аналитическая. Соберите всю имеющуюся информацию, изучите структуру системы, установки и цели; проводите тестирование на основе этих обширных и глубоких знаний.

Интуитивная. Тестируйте в соответствии с тем, что говорят коллективный опыт, мудрость и интуиция сотрудников группы тестирования на предмет того, что следует тестировать.

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

Быстрая. Тестируйте, применяя облегченные процессы, в поиске вероятных ошибок ориентируйтесь на готовность реагировать на недавно внесенные изменения.

Функциональная. Тестируйте каждую функцию системы по очереди.

Основанная на требованиях или претензиях. Тестируйте каждое требование или претензию к продукту.

Автоматизированная регрессия. Тестируйте, применяя исключительно автоматизированные тесты, которые можно повторить при необходимости проверки на наличие регрессии.

На основе состояний системы. Тестируйте различные состояния и переходы из одного состояния в другое, которые могут иметь место.

На основе сценариев использования системы. Тестируйте в соответствии с различными возможными в реальной жизни сценариями по всем областям функциональности системы.

На основе областей системы. Анализируйте различные области входных и выходных данных и обработки данных, которые есть в системе, проверяйте наиболее репрезентативных представителей каждой области.

Массовая случайная. Тестируйте огромное количество совокупностей данных, выбранных случайным образом, при помощи автоматизированных инструментов.

На основе качества. Тестируйте, ориентируясь на важные свойства системы, такие как функциональность, удобство и простота использования, надежность, производительность‚ масштабируемость и т.д.


А какую стратегию тестирования используете вы?