Thursday, June 15, 2006

Взлом и защита 1С:Предприятие 7.7

Взлом и защита 1С:Предприятие 7.7

В статье описаны как штатные механизмы защиты 1С:Предприятие 7.7 от обхода встроенной системы разграничения прав доступа, так и параметры настройки реестра Windows, а также программные ограничения WH_CBT (Computer Base Training - блокировки для обучающих программ). Показано сокрытие кнопки Пуск и рабочего стола средствами Windows API.
Автор статьи: romix | Редакторы: Волшебник
Последняя редакция №9 от 26.04.06 | История
URL: http://kb.mista.ru/article.php?id=55


Ключевые слова: WH_CBT, Computer Base Training, защитить базу от скачивания, настроить права доступа, скрыть рабочий стол, скрыть кнопку Пуск, заблокировать диалоги открытия, заблокировать диспетчер задач, заблокировать Windows+E, заблокировать Windows+R, NoWinKeys, DisableTaskMgr


Блокируем запуск внешнего кода на языке 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С:Предприятие, можно проверять при старте системы значение КаталогПрограммы(). Данный каталог необходимо разместить на сервере и защитить от изменения пользователями. Если каталог программы отличается от требуемого, то необходимо завершать пользовательский сеанс (возможно, с отправкой уведомления администратору).

При терминальном доступе данной проблемы не существует (конечно, при условии, что права терминального пользователя не позволяют ему патчить программные файлы).




Скомпилированные примеры кода из статьи приведены здесь:
http://x-romix.narod.ru/WinHooks.rar
Скачивать левой кнопкой мыши (20К).


-----
см. также:
http://www.i2r.ru/static/530/out_13477.shtml
Книга знаний: Запрет запуска ert на низком уровне

No comments: