четверг, 14 апреля 2016 г.

Cache': О безопасности csp приложений

Что я рекомендую сделать для повышения безопасности Cache' при выставлении csp приложений в интернет.
Закрыть файрволом порты 1972/1973 (cache direct), 4001 (license manager), 23 (ctelnetd), порт 7200 (SMWrap) и любые другие, используемые сервером cache', от нежелательного доступа извне.

Удалить все базы данных и области кроме используемых Вашими приложениями и штатных, требующихся для нормальной работы сервера:
%SYS
%CACHELIB
CACHETEMP
USER
Все остальные удалите.

Очистить базу USER. Базу оставьте, но содержание тщательным образом прочистите. Проверьте что нет глобалов, рутин и классов. Для чего нужна база USER в пустом виде - в некоторых случаях процессы автоматически начинают работу с этой области, потом переключаясь в другую. Если этой базы не будет, то некоторые программы не смогут запуститься. Какие именно программы - не скажу, чтобы не ронять имидж производителей.
ZN "USER"
D DeleteAll^%apiOBJ()
rm /usr/cachesys/csp/user/*


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

Тщательно изучите документацию на используемую Вашими csp приложениями версию cache в части обработки ошибок в csp приложениях и проработайте тему "страница обработки ошибок". Как ее сделать, прописать в приложении и что в ней делать. Если Вы решили оставить %CSP.Error, то пропатчте её, убрав вызов
Do ##class(%CSP.Utils).DisplayAllObjects()
И вообще уберите из нее все что не нужно Вашему приложению в боевой эксплуатации. На девелоперской инсталляции хоть соловьем свистите, а с боевой убирайте.

В области %CACHELIB удалить все классы производные от %CSP.Page кроме %CSP.Broker и %CSP.StreamServer. В более старших версиях это область %SYS.
ZN "%CACHELIB"
S derivedclasses=""
D GetAllDerivedClasses^%occLibrary("%CSP.Page",.derivedclasses)
S c="" F  s c=$O(derivedclasses(c)) q:c=""  d
. I c'="%CSP.Broker",c'="%CSP.StreamServer" d
. . W c,! D Delete^%apiOBJ(c)
Если не выполняется
ZN "%CACHELIB"
то выполните
d $zu(5,"%CACHELIB")
Здесь оставляется класс %CSP.StreamServer и класс %CSP.Broker. Если ни одно Ваше приложение не использует %CSP.StreamServer то его тоже удалите. Класс %CSP.Broker используется для гиперсобытий. Если ни одно Ваше csp приложение их не использует то его тоже удалите.

В случае если в Вашей версии каше возникают разночтения с приведенным кодом то удалите классы вручную. В Cache Studio переключитесь в область %SYS или %CACHELIB, откройте класс %CSP.Page и в меню Класс | Унаследованные классы посмотрите список процентных классов - наследники от %CSP.Page. Удалите их.

Тут может быть проблема с тем, что в Вашей версии каше могут оказаться процентные классы - наследники %CSP.Page, которые при этом отмечены как hidden, и Cache Studio их может не показать. Изучите как включить показ скрытых классов и убедитесь что Вы действительно удалили все процентные наследники от %CSP.Page.

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

Запретить в sql использование extrinsic функций (в конфигураторе). По умолчанию в Cache 5.0.15 оно запрещено:
ExtrinsicFunctions=0
Это тоже относится к безопасности csp, поскольку технически позволяет в зависимости от построения приложения использовать уязвимость класса sql injection.

Тщательно ознакомьтесь с документацией на используемую Вами версию каше в части управления шлюзом csp через браузер. Удалите все, что сможете, что относится к такому управлению, например cspmssys.dll в Windows версии. Не давайте ни малейшей возможности как-то вмешаться в работу Ваших csp приложений извне. Все управление выполняйте на отладочном сервере с переносом ini файлов конфигурации, либо на короткое время восстанавливайте управляющую часть шлюза, а после конфигурирования снова убирайте.

Теперь об уязвимостях класса code injection в Ваших csp приложениях.

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

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

Важно - ни в коем случае не делайте предположения "злоумышленник этого не сможет", например "мы ожидаем значение индекса, к имени обращаемся через $d(), тут злоумышленник не сможет выполнить команду". Сможет. Как - не скажу.

Тщательно проверяйте использование вашим приложением файлов операционной системы и системных вызовов (функции $zf, работа с девайсами). От найденных мест их использования возвращайтесь к приему параметров и тщательно анализируйте, могут ли быть использованы параметры страницы в аргументах этих команд и функций.

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

Периодически проверяйте инсталляцию Cache на предмет несоответствия ее вышеприведенным требованиям. Ситуация может измениться при совсем небольшом обновлении приложения. При смене версии каше выполните все вышеприведенные шаги снова. Изучите свои особенности и сделайте так чтобы Вы это не забыли сделать.

Этот перечень не обязан быть полным. Время идет и в следующих версиях каше могут появиться новые дополнения и улучшения.

Евгений Каратаев


Отказ от ответственности.
Данный материал ориентирован исключительно на защиту csp приложений от несанкционированного доступа к серверу и не содержит демонстрационных примеров как использовать имеющиеся уязвимости. Иных рекомендаций и консультаций не даю. Несанкционированный доступ наказуем в соответствии с действующим законодательством.

Комментариев нет:

Отправить комментарий