Статья помещена в хаб C++, поэтому нужно внести уточнения.
Ну и последний минус — это конечно же производительность. Если объектов-владельцев достаточно много, то создание и уничтожение вместо одного объекта двух или более может не остаться незамеченным.
В C++ это не так, потому что при композиции в объекте хранятся сами подобъекты, а не указатели на них (как это происходит в Java в общем случае). Если подобъект мал, то его имеет смысл хранить не через указатель, а напрямую. Если хочется при этом сохранять бинарную совместимость между версиями кода, то можно в объекте-хозяине хранить только указатель, а все поля запихнуть в структуру, доступную через этот указатель в коде реализации (pointer to implementation). Часто это более мудрый путь, чем хранить каждое из полей через указатель.
Возможность смены агрегируемого объекта в runtime.
Чтобы воспользоваться данным преимуществом в C++, нужно хранить в объекте указатели на подобъекты или использовать подобъекты одного типа.
1. клиент соединяется с сервером и устанавливает шифрованый канал, на основе rsa\dsa ключей сервера.
Прежде чем пояснять по моему второму пункту, я уточню принцип работы Intercepter-NG. Как я понял, он работает как ssh-сервер, принимает команды и вызывает их на настоящем сервере, подключившись к нему как ssh-клиент. Если я неправильно этот момент уяснил, то дальнейший мой ответ, скорее всего, неверен.
Дополнительный вопрос: работают ли программы, интенсивно использующие возможности терминала: vim, screen (tmux)?
Пользуясь Вашим подходом, сессию как раз можно было бы увести (то есть начать в живую вводить команды за пользователя), однако, как я понял из статьи, такой возможности нет. Поэтому, раз её всё равно нет, я предложил не «влезать» в открытый текст (будь то команды, SFTP, туннели и остальные «надстройки»), а передавать его как есть, сохраняя себе копию. Анализ этой копии (выполняемый постфактум) выявит всё, что передавалось, будь то команды, файлы или туннели. Причем можно сначала реализовать только извлечение команд, а возможность извлечения SFTP добавить потом, при этом SFTP можно будет извлекать и из старых дампов тоже, так как в них записывается всё, а не только то, что текущая версия умеет извлекать.
Спасибо за проделанную работу. Есть несколько замечаний.
1. Насколько мне известно, шифрованный канал создается не на основе rsa/dsa ключа сервера, а при помощи алгоритма Диффи — Хеллмана. Отсюда следует интересный факт, что от длины ключа сервера не зависит вероятность успешной прослушки.
2. Насколько я понял из статьи, нет возможности «увести» сессию (чтобы работать на сервере от имени жертвы). В этом случае более надежным и простым решением кажется атака на уровень шифрования (алгоритм Диффи — Хеллмана и подмена публичного ключа сервера), при которой открытый текст, включая изменения размеров терминала, SFTP, туннелирование и т. д., передавался бы как есть, а его копия записывалась бы сервером атакующего. Такой режим не даст атакующему вмешаться и что-то сделать на сервере от имени пользователя, зато будут работать SFTP и туннели и меньше будет риск глюков (при той же работе с терминалом), которые могут выдать прослушку.
3. Пожалуйста, не делайте ошибку в слове «асимметричный», оно происходит от слова «symmetry», а не от слова «ass». К сожалению, ошибка очень популярна в материалах по криптографии, поэтому я обращаю на неё внимение.
Что касается разработки Desktop-приложений, то Qt Creator (C++) мне кажется достаточно удобным. Опробовано для Linux/Windows и впечатление осталось положительное. Не приходится самому писать большой Makefile, есть графический редактор форм (Qt Designer), встроенное средство для перевода (Qt Linguist), встроенная документация (Qt Assistant). Насколько помню разработку под Java, инструмента с аналогичным набором функций для этого нет.
Количество кода известно. В XP около 40 миллионов строк кода. Думаю, у спецслужб хватит ресурсов, чтобы изучить такой объем кода и найти в нём ошибки, приводящие к уязвимостям. Было несколькопрецедентов публикации Microsoft исходников под свободными лицензиями, правда в обоих случаях их вынудила к этому копилефт-лицензия использованного кода.
Есть программа ajaxterm, которая создает http-сервер, отображающий терминал, реализованный средствами JavaScript, соединенный с ssh-сервером. Преимущество с точки зрения безопасности в том, что точка входа на сервер всё равно одна (ssh-сервер), а программа ajaxterm является ssh-клиентом и может быть запущена без прав root. Программа может оказаться полезной, когда нет ssh-клиента, но есть браузер, либо когда порт ssh-сервера заблокирован умными людьми. Бонус: ajaxterm есть в репозиториях Debian и Ubuntu.
Спасибо за замечание! Ошибка исправлена. Библиотеки должны быть перечислены в списке аргументов компилятора после имени файла с исходным кодом. Некоторые компиляторы принимают неправильный порядок аргументов. Так поступает и мой компилятор (gcc 4.4.5), поэтому ошибку не заметили.
Rather than enforcing an exact string match, the code would effectively accept any string that satisfies the pattern sub-expression referenced by the back-reference symbol.
A similar problem still afflicts back-references that are embedded in a larger quantified expression, rather than being the immediate subject of the quantifier. This will be addressed in a future PostgreSQL release.
2. 9-1-5
Fix extraction of common prefixes from regular expressions (Tom Lane)
The code could get confused by quantified parenthesized subexpressions, such as ^(foo)?bar. This would lead to incorrect index optimization of searches for such patterns.
3. 9-2
Sync regular expression code with TCL 8.5.11 and improve internal processing (Tom Lane)
В C++ это не так, потому что при композиции в объекте хранятся сами подобъекты, а не указатели на них (как это происходит в Java в общем случае). Если подобъект мал, то его имеет смысл хранить не через указатель, а напрямую. Если хочется при этом сохранять бинарную совместимость между версиями кода, то можно в объекте-хозяине хранить только указатель, а все поля запихнуть в структуру, доступную через этот указатель в коде реализации (pointer to implementation). Часто это более мудрый путь, чем хранить каждое из полей через указатель.
Чтобы воспользоваться данным преимуществом в C++, нужно хранить в объекте указатели на подобъекты или использовать подобъекты одного типа.
Прежде чем пояснять по моему второму пункту, я уточню принцип работы Intercepter-NG. Как я понял, он работает как ssh-сервер, принимает команды и вызывает их на настоящем сервере, подключившись к нему как ssh-клиент. Если я неправильно этот момент уяснил, то дальнейший мой ответ, скорее всего, неверен.
Дополнительный вопрос: работают ли программы, интенсивно использующие возможности терминала: vim, screen (tmux)?
Пользуясь Вашим подходом, сессию как раз можно было бы увести (то есть начать в живую вводить команды за пользователя), однако, как я понял из статьи, такой возможности нет. Поэтому, раз её всё равно нет, я предложил не «влезать» в открытый текст (будь то команды, SFTP, туннели и остальные «надстройки»), а передавать его как есть, сохраняя себе копию. Анализ этой копии (выполняемый постфактум) выявит всё, что передавалось, будь то команды, файлы или туннели. Причем можно сначала реализовать только извлечение команд, а возможность извлечения SFTP добавить потом, при этом SFTP можно будет извлекать и из старых дампов тоже, так как в них записывается всё, а не только то, что текущая версия умеет извлекать.
1. Насколько мне известно, шифрованный канал создается не на основе rsa/dsa ключа сервера, а при помощи алгоритма Диффи — Хеллмана. Отсюда следует интересный факт, что от длины ключа сервера не зависит вероятность успешной прослушки.
2. Насколько я понял из статьи, нет возможности «увести» сессию (чтобы работать на сервере от имени жертвы). В этом случае более надежным и простым решением кажется атака на уровень шифрования (алгоритм Диффи — Хеллмана и подмена публичного ключа сервера), при которой открытый текст, включая изменения размеров терминала, SFTP, туннелирование и т. д., передавался бы как есть, а его копия записывалась бы сервером атакующего. Такой режим не даст атакующему вмешаться и что-то сделать на сервере от имени пользователя, зато будут работать SFTP и туннели и меньше будет риск глюков (при той же работе с терминалом), которые могут выдать прослушку.
3. Пожалуйста, не делайте ошибку в слове «асимметричный», оно происходит от слова «symmetry», а не от слова «ass». К сожалению, ошибка очень популярна в материалах по криптографии, поэтому я обращаю на неё внимение.
Интересно, можно ли найти, кому предназначался тот инвайт и кем он был выдан.
Наверное, подразумевалась статическая или явная типизация.
1. 9-1-3
Fix regular expression back-references with * attached (Tom Lane)
Rather than enforcing an exact string match, the code would effectively accept any string that satisfies the pattern sub-expression referenced by the back-reference symbol.
A similar problem still afflicts back-references that are embedded in a larger quantified expression, rather than being the immediate subject of the quantifier. This will be addressed in a future PostgreSQL release.
2. 9-1-5
Fix extraction of common prefixes from regular expressions (Tom Lane)
The code could get confused by quantified parenthesized subexpressions, such as ^(foo)?bar. This would lead to incorrect index optimization of searches for such patterns.
3. 9-2
Sync regular expression code with TCL 8.5.11 and improve internal processing (Tom Lane)
Версия: 9.2.3-1.pgdg60+1 (сборки для Debian Squeeze на pgapt.debian.net/).