В статье описаны как штатные механизмы защиты 1С:Предприятие 7.7 от обхода встроенной системы разграничения прав доступа, так и параметры настройки реестра Windows, а также программные ограничения WH_CBT (Computer Base Training — блокировки для обучающих программ). Показано сокрытие кнопки Пуск и рабочего стола средствами Windows API. | Автор статьи: romix | Редакторы: Волшебник, gubsky, Попытка1С Последняя редакция №11 от 29.02.08 | История URL: http://kb.mista.ru/article.php?id=55 |
Блокируем запуск внешнего кода на языке 1С
Оказывается, 1С:Предприятие 7.7 не выполняет проверок прав доступа со стороны программного кода – все проверки выполняются только в интерактивном (пользовательском) режиме. Поэтому для защиты необходимо полностью закрыть любые возможности для выполнения любого поступающего извне программного кода, что вполне обеспечивают средства администрирования 1С (и системы Windows NT/2000/XP).
Откроем в Конфигураторе информационную базу и зайдем на вкладку Права. Дважды щелкнем на название имеющегося набора прав (или создадим новый набор). Из контекстного меню при клике на корневом элементе появившегося «дерева» выберем единственный пункт «Свойства». В списке перечислены потенциально опасные действия пользователей. Рассмотрим некоторые из них.
Настройка: Административные функции
Уберите эту галочку, и пользователи не смогут под своим паролем изменять конфигурацию (файл конфигурации MD).
Разумеется, типичный Темный Пользователь может пойти обходным путем, и изменить непосредственно файл MD (например, при помощи плагина для FAR DocFile Browser, который умеет читать и изменять Compound-файлы Microsoft). Поэтому, файл MD необходимо открыть пользователям для доступа по сети только на чтение. Аналогично следует поступать с текстовыми файлами, которые извлечены из MD посредством директивы #ЗагрузитьИзФайла или внешней компоненты TurboMD.
Настройка: Использование в качестве OLE Automation сервера
Информационную базу можно «поюзать» через механизм OLE. Закройте для Темного Пользователя еще одну дверь, которая позволила бы ему видеть и изменять в информационной базе все.
Настройка: Использование любых Внешних Отчетов и Обработок
Уберите эту галочку, и Темные Пользователи не смогут запускать программный код 1С в виде привнесенных извне отчетов и обработок (файлов ert). Эта возможность тоже, независимо от прав, позволяет делать с информационной базой практически все.
Настройка: Использование общих Внешних Отчетов и Обработок
Общие внешние отчеты и обработки находятся в папке ExtForms. На эту папку, разумеется, необходимо установить права доступа «только на чтение». Иначе Темные Пользователи положат в эту папку нужные им обработки, и выполнят произвольный программный код.
Настройка: Использование функций в табло и формульном калькуляторе
Малоизвестная возможность, но она тоже позволяет «сделать все», не имея никаких других прав.
Откройте пункт меню Сервис-Табло. Наберите в появившемся Табло (засветите в него) следующий программный код:
ОткрытьФорму("Отчет",," Тест.ert")
Если в каталоге информационной базы лежит внешний отчет Тест.ert, то он будет открыт и выполнен, независимо от установленных у пользователя прав на выполнение Внешних Отчетов и Обработок. Аналогичная возможность имеется для калькулятора, если в меню Сервис-Параметры, на вкладке Общие, Темный Пользователь установил для него формульный режим.
Методы ОткрытьФорму/ОткрытьФормуМодально
Аналогичная уязвимость может существовать для конфигураций: если они выполняют встроенную функцию 1С наподобие
ОткрытьФорму("Отчет", , ИмяФайлаОтчета); ОткрытьФормуМодально("Отчет", , ИмяФайлаОтчета);
не проверяя пользовательские права, то Темный 1С-ник может сделать с информационной базой опять же все, что захочет, ибо для него информационная база полностью открыта. Поэтому закройте в систему и эти «врата», и у Темного 1С-ника будет меньше шансов выполнить свое черное дело.
Защита таблицы
Для защиты таблиц от Темного Пользователя в 1С:Предприятие имеется встроенный метод Защита(), который позволяет отключить возможность копирования таблицы, в том числе через буфер обмена.
ОбработкаЯчейкиТаблицы
Темный 1С-ник может занести в поле Расшифровка таблицы совсем не то, что предусматривал разработчик.
Например, «Отчет.КарточкаСчета». Таким способом, он может открыть «неположенный» ему по должности отчет.
Блокируем чтение и изменение таблиц данных
Информационную базу (особенно, в DBF-варианте) злоумышленник может скопировать и унести целиком, ибо в сжатом виде она может «весить» совсем немного. После этого, злоумышленник может просто удалить папку с паролями, и получить к своей копии базы полный, ничем не ограниченный доступ.
SQL-вариант информационной базы тоже может быть скопирован, но для этого надо знать имя сервера и пароль пользователя sa (или логин и пароль dbo). Как же узнать эту информацию? Она хранится (в зашифрованном виде) в файле DBA информационной базы, и поддается расшифровке при помощи небольшой «хакерской» утилиты (название не помню).
Впрочем, во многих случаях пароль sa назначен пустым, или представляет собой любимое многими администраторами значение 123. Чтобы выяснить этот факт, достаточно воспользоваться сетевым сканером безопасности, который выявит в вашей сети эти и подобные огрехи. Удачным сканером безопасности является программа x-spider.
Однако, про утилитку, извлекающую из информации о подключении логины и пароли, Темные Пользователи, разумеется, уже знают, поэтому пустой или не пустой пароль sa — особой роли уже не играет. Факт в том, что при любом пароле Темные Пользователи могут делать с информационной базой 1С все, что угодно: копировать всю базу, а также изменять или удалять отдельные записи. Правда, это придется делать на более низком уровне (правкой таблиц информационной базы), но ничего невозможного или сверхсложного в этом нет. Таблицы есть таблицы, просматривать и редактировать их можно небольшими утилитами или скриптами (в т.ч. из комплекта Microsoft Office), а связи между элементами данных прописаны в текстовом файле DD/DDS.
Защита при помощи сервера терминалов
Поэтому, пожалуй, единственным способом защититься от подобных атак является запрет запуска в пользовательском сеансе 1С других программ, за исключением 1С:Предприятие (это может быть реализовано, например, на сервере терминалов). Защита от запуска посторонних программ реализуется при помощи ключа реестра RestrictRun (или соответствующих настроек в групповой политике домена).
HKCU\ Software\ Microsoft\ Windows\ CurrentVersion\ Policies\ Explorer\RestrictRun
Строковые параметры с именами в виде чисел по возрастанию указывают, запуск каких программ необходимо разрешить (запуск остальных будет запрещен), например:
1=c:\Program Files\1Cv77\BIN\1cv7s.exe 2=c:\program files\msoffice\winword.exe
При экспериментах разрешите себе запуск regedit.exe.
Прописывайте полные пути, иначе Темный Пользователь сможет назвать именем 1cv7s.exe произвольный софт.
Скрываем кнопку Пуск и Рабочий стол
Пример программы, которая скрывает кнопку Пуск (вместе с панелью задач) и рабочий стол.
Чтобы от панели задач не оставалась «дырка» в окне Windows, включите ее (панели задач) автоскрытие.
Компилятор – Delphi 6.
Имя файла – HideStartButton.dpr.
Program HideStartButton; uses Windows; var h1, h2 : THandle; begin h1 := FindWindow('ProgMan', nil); h1 := GetWindow(h1, GW_CHILD); ShowWindow(h1, SW_HIDE); h2 := FindWindow('Shell_TrayWnd', nil); ShowWindow(h2, SW_HIDE); MessageBox(0, 'Рабочий стол и кнопка Пуск были скрыты.', 'HideStartButton', MB_ICONINFORMATION); ShowWindow(h1, SW_SHOW); ShowWindow(h2, SW_SHOW); MessageBox(0, 'Рабочий стол и кнопка Пуск были восстановлены.', 'HideStartButton', MB_ICONINFORMATION); end.
Скомпилированные примеры кода приведены в конце этой статьи.
Блокируем окна «Открыть» и «Сохранить как», а также меню Пуск
Пример программы, которая блокирует окна «Открыть» и «Сохранить как», а также запрещает открытие меню кнопки Пуск по нажатию Ctrl-Esc и кнопки Windows.
Компилятор – Delphi 6.
Имя файла – HookCreateWindow.dpr.
Program HookCreateWindow; uses Windows; var HookHandle: hHook; /////////////////////////////////////////////////////////////////////// //Ловушка WH_CBT (Computer Base Training - блокировки для обучающих программ) function CBTProc(Code: integer; WParam: word; LParam: Integer): Longint; stdcall; type PCBT_CREATEWND=^CBT_CREATEWND; var s: pchar; var z: PCBT_CREATEWND; var ok: Integer; begin if Code<0 then begin Result := CallNextHookEx(HookHandle, code, WParam, LParam); exit; end; case Code of HCBT_CREATEWND: begin //Перехватываем создание окна z:=PCBT_CREATEWND(LParam); //Получаем заголовок окна s:=z.lpcs.lpszName; if s<>nil then begin ok:=0; //Сравнение заголовка окна и подстроки if s^<>'О' then ok:=1; inc(s); if s^<>'т' then ok:=1; inc(s); if s^<>'к' then ok:=1; inc(s); if s^<>'р' then ok:=1; inc(s); if s^<>'ы' then ok:=1; inc(s); if s^<>'т' then ok:=1; inc(s); if s^<>'ь' then ok:=1; inc(s); if s^<>#0 then ok:=1; if ok=0 then begin //Если подстрока найдена.. Result:=1; //.. то запрещаем открытие окна exit; end; end; end;// HCBT_CREATEWND: HCBT_SYSCOMMAND: begin case WParam of //Блокируем меню Пуск по Ctrl-Esc и клавише Windows SC_TASKLIST: begin Result:=1; //Запрещаем действие exit; end; end;//case WParam end; // HCBT_SYSCOMMAND: end;//case Result := 0;//Разрешаем действие end; /////////////////////////////////////////////////////////////////////// begin //Устанавливаем ловушку на сообщения WH_CBT HookHandle := SetWindowsHookEx(WH_CBT, @CBTProc, HInstance, 0); if HookHandle<=0 then begin MessageBox(0,'Ошибка - ловушка не была установлена!','HookCreateWindow',MB_ICONERROR); Exit; end; MessageBox(0, 'Ловушка установлена. Проверьте диалоги открытия и записи файла.', 'HookCreateWindow', MB_ICONINFORMATION); //Убираем ловушку if HookHandle <> 0 then UnhookWindowsHookEx(HookHandle); MessageBox(0, 'Ловушка снята. Диалоги открытия и записи файла снова доступны.', 'HookCreateWindow', MB_ICONINFORMATION); end.
Скомпилированные примеры кода приведены в конце этой статьи.
Автозапуск примеров
Автозапуск примеров из меню «Пуск-Программы-Автозагрузка» может быть отключен Темным пользователем удерживанием при старте клавиши Shift. Поэтому, автозапуск необходимо поместить «поглубже» в реестр.
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run] "HideDesktop"="E:\\Защита1С\\WinHooks\\HideStartButton\\HideStartButton.exe /i" "HookCreateWindow"="E:\\Защита1С\\WinHooks\\HookCreateWindow\\HookCreateWindow.exe /i"
Для их автозапуска для всех пользователей —
[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run]
(однако, будьте с этим осторожны, чтобы не заблокировать все себе).
Ключ /i отключает окна с вопросами и заставляет программу «заснуть».
if ParamStr(1)='/i' then begin repeat sleep(10000); until false; end;
Это не самый лучший способ оставить программу в памяти, но он работает (не хотелось усложнять примеры). Другой вариант сделать то же самое — запустить их как службу (если вы, конечно, знаете, как это проделать).
Автозапуск примеров для текущего пользователя
"HideDesktop"="E:\\Защита1С\\WinHooks\\HideStartButton\\HideStartButton.exe /i" "HookCreateWindow"="E:\\Защита1С\\WinHooks\\HookCreateWindow\\HookCreateWindow.exe /i"
Блокируем нажатия Windows-E и Windows-R
Они открывают, соответственно, проводник и окно «Запуск программы», которые позволят Темному Пользователю сделать свое черное дело.
Ключ реестра NoWinKeys блокирует горячие клавиши Windows:
HKCU\
Software\
Microsoft\
Windows\
CurrentVersion\
Policies\
Explorer\NoWinKeys = dword:1m
Отключение запуска диспетчера задач по Ctrl-Alt-Del
Еще одна лазейка для Темного Пользователя.
Ключ реестра DisableTaskMgr блокирует диспетчер задач:
HKCU\
Software\
Microsoft\
Windows\
CurrentVersion\
Policies\
System\DisableTaskMgr = dword:1
Блокируем изменение программных файлов 1С:Предприятие
Патчинг программных файлов 1С:Предприятие позволяет исключить проверки паролей на файл метаданных, на внешние отчеты и обработки и на пользовательский сеанс 1С:Предприятие (фактически, пользователь может заходить под любой учетной записью, не указывая пароль).
Чтобы заблокировать вход с непредусмотренных программных файлов 1С:Предприятие, можно проверять при старте системы значение КаталогПрограммы(). Данный каталог необходимо разместить на сервере и защитить от изменения пользователями. Если каталог программы отличается от требуемого, то необходимо завершать пользовательский сеанс (возможно, с отправкой уведомления администратору).
При терминальном доступе данной проблемы не существует (конечно, при условии, что права терминального пользователя не позволяют ему патчить программные файлы).
Проверка на наличие файла USERS.USR
Актуально для ДБФ версии. В Глобальном модуле в ПриНачалеРаботыСистемы() можно сделать проверку на наличие файла USERS.USR и если его нет, то завершать работу программы. Попытку запуска 1С без названного файла можно писать в лог.