Как было объяснено в предыдущем разделе, сетевой сервер передает пакет по тому каналу, который в данный момент наиболее доступен. В локальных сетях коммутатор передает пакеты, не заботясь о защите информации от доступа извне. Однако, когда информация передается по Интернету, может возникнуть следующая ситуация: при передаче пакета из компьютера, находящегося у вас дома, на компьютер, стоящий у вас в офисе, пакет может пройти сквозь сервер, принадлежащий фирме-конкуренту. В следующих главах вы узнаете, как шифровать сообщения и информацию, чтобы защитить их от перехвата при передаче.
Глава 3. Что необходимо знать для понимания хакинга
В этой главе я постараюсь очень кратко наметить то, что нужно знать хакеру и грамотному системному администратору, на которого легла задача по обеспечению безопасности сети. В рамках данного руководства невозможно описать все эти вещи полностью.
3.1. Языки программирования
Основой хакерства является вовсе не умение картинно сидеть перед экраном монитора, азартно топча клавиатуру, а знание языков программирования. Каких именно? Кратко расскажем о языках, которые используются для хакинга.
Год рождения ARPANET был также годом, когда хакер из «Bell Labs» по имени Кен Томпсон (Ken Thompson) создал Unix. Томпсон был вовлечен в работу по разработке операционной системы, называемой Multics. Multics должна была облегчить использование и программирование ЭВМ, чтобы увеличить производительность работы. Этот проект был выставлен на продажу, но никогда не пользовался таким успехом, как операционная система. Томпсон отказался от среды Multics и начал обыгрывать смесь идей Multics’a со своими собственными.
Другой хакер по имени Деннис Ричи (Dennis Ritchie) придумал новый язык, названный «С», для использования под «изначальным» Unix’oM Томпсона. Подобно Unix, «С» был разработан, чтобы быть естественным и гибким. Интерес к этим инструментам распространился в Bell Labs, и они получили популярность в 1971 г., когда Thompson и Ritchie выиграли тендер на то, что мы теперь называем системой автоматизации делопроизводства для внутреннего использования в фирме.
Традиционно операционные системы писались на ассемблере, чтобы извлечь максимально возможную эффективность (КПД) из хост-машин. Томпсон и Ричи были среди первых, кто понял, что аппаратные средства и технология компилирования стали достаточно хороши, чтобы операционная система полностью могла быть написана на «С», и к 1974 г. среда целиком была успешно перенесена на несколько машин различных типов.
Такого раньше никогда не было, и результаты были впечатляющими. Раз Unix мог представлять одинаковый интерфейс, одинаковые возможности на машинах многих различных типов, то он мог стать средой стандартного программного обеспечения для всех них. Пользователям не надо было больше платить за разработку нового программного обеспечения всякий раз, когда машины устаревали.
Помимо переносимости, Unix и «С» имели еще одну важную силу. Они были сконструированы как философия «для самых тупых». Программист мог легко удерживать полную логическую структуру «С» в своей голове (в отличие от большинства других языков), вместо того чтобы постоянно обращаться к справочникам; и Unix был структурирован как гибкий инструментарий простых программ, разработанных для комбинирования друг с другом в необходимых направлениях.
В начале 1996 г. появился новый язык программирования – «Java». На домашней странице Consortium Java была внесена в список так называемых Мобильных кодов – одного из перспективных направлений развития технологии World Wide Web. И вот в конце 1996 г. на Западе начался бум Java, который к моменту проведения выставки Unix-Expo-96 докатился и до нашей страны. Согласно истории технология Java (кофе) роди-лась из проекта Oak (дуб), основной целью которого была разработка объектно-ориентированных средств описания и коммуникации различного рода электронных устройств. Из-за неудачи Oak в 1994 г. опыт, накопленный в рамках его реализации, было решено применить к продуктам, ориентированным на применение в Интернете. С апреля 1995 г. по сети свободно распространяется Hotjava – интерфейс просмотра страниц World Wide Web для платформ Sun.
Буквально через месяц Netscape Communication – тогдашний законодатель моды в разработке программ-интерфейсов Интернета – покупает лицензию на Java. С этого момента начинается золотое время для этой технологии. В настоящее время Hotjava реализована не только для Sun-. OS и Solaris, но и для многих других платформ и Windows.
Система программирования на Java позволяет компилировать программы для компьютерной платформы, на которой она стоит в том же ключе, как и любая другая, например С или C++. В этом случае основным отличием Java-программ, которые называются Java-applications, является использование библиотеки Java-классов, которые обеспечивают разработку безопасных, распределенных систем. При этом утверждается, что язык позволяет делать гораздо меньше ошибок при разработке программ. Главным при этом является тот факт, что в Java напрочь отсутствует адресная арифметика. Гораздо более интересным является разработка мобильных Java-байт-кодов, которые в терминах Java-технологии называются applets.
Известный в свое время язык программирования Модула-2 был создан Н. Виртом в 1979 г. и впервые реализован на мини-ЭВМ PDP-11. В 1970-х гг. Паскаль получил широкое признание у пользователей ЭВМ и преподавателей, однако первоначально он был разработан для обучения программированию и как язык разработки програмного обеспечения имел много недостатков. В Модуле-2 эти недостатки были устранены, но при этом сохранены логическая структура и характерные черты его предшественника. Кроме того, в Модуле-2 были введены новые мощные языковые средства.
Язык программирования Модула-2 относится к так называемым машинонезависимым языкам. Н. Вирт применил Модулу-2 в написании полной операционной системы для мини-ЭВМ Lilith. Характерной чертой Модулы-2 является раздельная компиляция, позволяющая разрабатывать и хранить в библиотеках программы, которые можно использовать повторно.
Первые версии языка программирования Си++ (тогда он назывался «Си с классами») были разработаны в начале 1980-х гг. Бьярном Страуструпом, сотрудником знаменитой AT&T Bell Labs, где ранее были разработаны операционная система Unix и язык программирования Си. По признанию самого автора языка, Си++ никогда не разрабатывался на бумаге. Проектирование, реализация и документирование новых возможностей происходили фактически одновременно. Единственной целью разработки было создание языка, на котором было бы удобно программировать автору и его друзьям. За основу был взят популярный в среде профессиональных разработчиков язык программирования Си. Первыми средствами, которыми был расширен Си, стали средства поддержки абстракций данных и объектно-ориентированного программирования. Как это принято в AT&T, описание нового языка не было опубликовано сразу. Первыми его пользователями стали сами сотрудники Bell Labs.
Perl. Когда встает вопрос о создании приложений системного уровня, в частности сценариев Web-cepвepoв, на первый план выходит язык программирования Perl -прежде всего благодаря своей проверенности и богатству возможностей. Perl (Practical Extraction and Reporting Language, или, как иногда расшифровывают это название создатель Perl и другие его фанатичные приверженцы, – Pathologically Eclectic Rubbish Lister) является одним из наиболее мощных и популярных языков программирования.
История «Perl» началась в 1987 г., когда человек по имени Ларри Уолл занялся разработкой языка, необходимого ему для решения проблем системного программирования, с которыми он сталкивался как администратор Unix-систем. Несмотря на такое скромное начало, Perl вырос в полнофункциональный сложный язык. Он привлекателен тем, что заполняет разрыв между методами программирования коммандного процессора Unix и С-приложениями, обладая простотой первых и функциональностью последних. Уолл характеризует его так: «Perl – это интерпретируемый язык, оптимизированный для сканирования произвольных текстовых файлов, извлечения информации из этих файлов и печати отчетов на основе этой информации. С его помощью также можно решать многие задачи системного управления. При разработке этого языка целью была не столько красота (небольшой объем, элегантность и оптимальность), сколько практичность (простота в использовании, эффективность и полнота)». Уолл указывает также, что синтаксис выражений Perl находится в полном соответствии с синтаксисом выражений языка С; Perl не ограничивает произвольно объем ваших данных – «если вы располагаете памятью, Perl может загрузить в нее весь ваш файл как одну строку»; рекурсия может быть неограниченной глубины, а кроме того, язык применяет изощренные методы сопоставления с образцом для быстрого сканирования больших объемов данных.