Сообщения, об очередном дефекте защиты не редкость в компьютерных изданиях. Вирус, поражающий Microsoft Office, недостатки в операционных системах Windows или Unix, проблема с Java, «пробоина» в защите...

Брюс Шнайер — президент компании Counterpane Systems. С ним можно связаться по электронной почте по адресу schneier@counterpane.com

Просто поразительно, почему производители не могут все сделать как нужно? Изменится ли в конце концов ситуация к лучшему? Честно говоря, я не верю, что это когда-нибудь произойдет. И вот почему.

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

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

А тестировать вражеский компьютер неимоверно трудно. Практически все ПО создается методом проб и ошибок. Готовятся небольшие компоненты, тестируются, исправляются и опять тестируются. Небольшие «кусочки» объединяются в более крупный модуль, и этот модуль также тестируется и т. д. В конце концов создается программное обеспечение, которое функционирует почти так, как хотелось, хотя в сложных системах всегда остаются ошибки.

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

Единственный разумный способ «протестировать» защиту — провести ее проверку. Это дорогостоящий и длительный процесс, выполняемый вручную. Причем недостаточно только проанализировать протоколы защиты и алгоритмы шифрования. Проверка должна затрагивать спецификации, архитектуру, реализацию, исходные тексты, операции и т. д. И как функциональное тестирование не может доказать отсутствие ошибок, так и проверка защиты не может подтвердить, что продукт фактически является защищенным. Хуже того, проверка защиты версии 1.0 не позволяет сделать вывод о защите версии 1.1.

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

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

На самом деле именно это происходит с защитой. Продукты выпускаются вовсе без или с минимальным тестированием защиты. И с каждым годом они все более усложняются: появляются более крупные ОС, с большими возможностями, более разветвленными становятся связи между различными программами в Internet.

NT выпускается уже несколько лет и ошибки защиты обнаруживаются вновь и вновь.

Представьте, что то же самое верно для всех других компонентов программного обеспечения.

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