Обновление конфига exim 4.92 до актуала.

Почтовые сервера EXIM, sendmail, postfix, Dovecot и инфраструктура: MTA/MDA, антиспам, web‑почта, маршрутизация и эксплуатация почтовых систем.

Модератор: xM

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
darkomen
ефрейтор
Сообщения: 51
Зарегистрирован: 2011-06-28 13:18:29

Обновление конфига exim 4.92 до актуала.

Непрочитанное сообщение darkomen » 2025-04-01 11:41:47

Всем добрый день. Никак не могу решить проблему с экзим. Описаную в этой статье

https://mox.sh/sysadmin/tainted-filenam ... exim-4.94/

Tainted '/home/mail/user@example.com' (file or directory name for transport_test transport) not permitted

Есть роутер такого вида :

Код: Выделить всё

subdomain:
  driver = redirect
  domains = +our_domains : +local_domains
  data = ${lookup {$local_part} lsearch {/usr/local/etc/exim/aliases.ng} \
    { ${if exists {/usr/local/etc/exim/pmrc.$value} \
      { |/usr/local/bin/procmail -m \
        s=${if eq {$sender_address}{}{<>}{$sender_address}} \
        r=$local_part@$value.domain.ru /usr/local/etc/exim/pmrc.$value \
      } {$local_part@$value.domain.ru} \
    } } fail \
  }
  pipe_transport = pipe_pm

Нужно адаптировать его под новую версию . Пробовал делать так и еще много как , но не работает.

Код: Выделить всё

subdomain1:
  driver = redirect
  domains = lsearch;/usr/local/etc/exim/domainlist1
  local_parts = lsearch;/usr/local/etc/exim/aliases.ng
  data = ${lookup {$local_part_data} lsearch {/usr/local/etc/exim/aliases.domain.ru} \
    { ${if exists {/usr/local/etc/exim/pmrc.exchange} \
      { |/usr/local/bin/procmail -m \
        s=${if eq {$sender_address}{}{<>}{$sender_address}} \
 #       r=${local_part_data}@${value}.domain.ru /usr/local/etc/exim/pmrc.${value} \
        r=user@exchange.domain.ru /usr/local/etc/exim/pmrc.exchange \
      } {${local_part_data}@domain.ru} \
    } } fail \
  }
  pipe_transport = pipe_pm
Прошу помощи у тех кто хорошо знает екзим

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Raven2000
-=_UNIX_=-
Сообщения: 4496
Зарегистрирован: 2006-10-29 17:59:13
Откуда: Там, где нас нет.
Контактная информация:

Обновление конфига exim 4.92 до актуала.

Непрочитанное сообщение Raven2000 » 2026-08-18 16:10:18

Проблема в том, что после Exim 4.94 $local_part, $domain и результат lookup в $value считаются потенциально tainted. Их нельзя напрямую подставлять в путь к pmrc.* или использовать как часть команды pipe. Нужны данные, полученные из контролируемых lookup: $local_part_data и $domain_data.
Что неверно в исходнике

В старом варианте опасны оба фрагмента:

Код: Выделить всё

/usr/local/etc/exim/pmrc.$value
r=$local_part@$value.domain.ru
$value — результат ${lookup ...} и не следует использовать его как «очищенный» фрагмент пути.

$local_part — входные данные SMTP, также tainted.

Проверка exists не «очищает» строку: построенный путь уже содержит tainted-значение.

Статья, на которую ссылается автор, также подчёркивает: простое присваивание или копирование строки taint не снимает; нужно строить маршрутизацию через lookup и использовать *_data.
Рабочая схема

Если aliases.ng содержит соответствие вида:

Код: Выделить всё

user: exchange
а файл /usr/local/etc/exim/pmrc.exchange — доверенный, то не используйте результат lookup как имя файла. Вынесите допустимые значения в статически описанные router’ы или примените lookup, который возвращает уже известный, заранее заданный путь.

Например, если допустим только exchange:

Код: Выделить всё

subdomain_exchange:
  driver = redirect
  domains = +our_domains : +local_domains
  local_parts = lsearch;/usr/local/etc/exim/aliases.ng
  data = ${if eq{$local_part_data}{user}\
    {|/usr/local/bin/procmail -m \
      s=${if eq{$sender_address}{}{<>}{$sender_address}} \
      r=user@exchange.domain.ru \
      /usr/local/etc/exim/pmrc.exchange}\
    fail}
  pipe_transport = pipe_pm
Но это подходит, только если user и exchange фактически фиксированы. В вашем втором примере зафиксированные:

Код: Выделить всё

r=user@exchange.domain.ru
/usr/local/etc/exim/pmrc.exchange
как раз устраняют tainted-путь, однако local_part_data станет доступен лишь после успешного local_parts = lsearch;.... Сам файл aliases.ng должен содержать валидный lookup для конкретного локального адресата.
Вариант для нескольких поддоменов

Для нескольких значений наиболее надёжный и понятный путь — отдельные router’ы с фиксированными pmrc и адресом назначения:

Код: Выделить всё

subdomain_exchange:
  driver = redirect
  domains = +our_domains : +local_domains
  local_parts = lsearch;/usr/local/etc/exim/aliases.ng
  condition = ${if eq{$local_part_data}{exchange}{yes}{no}}
  data = |/usr/local/bin/procmail -m \
    s=${if eq{$sender_address}{}{<>}{$sender_address}} \
    r=exchange@exchange.domain.ru \
    /usr/local/etc/exim/pmrc.exchange
  pipe_transport = pipe_pm
Если aliases.ng — это таблица входящий_localpart : alias, то local_part_data — именно значение из таблицы, а не исходный local part. Поэтому логика должна опираться на фактический формат файла.
Важный нюанс

Нельзя безопасно «починить» старую конструкцию заменой:

Код: Выделить всё

pmrc.$value
на:

Код: Выделить всё

pmrc.${local_part_data}
если $local_part_data затем формирует имя файла. Для Exim 4.94+ каталог, имя файла и параметры доставки должны происходить из trusted lookup, либо быть фиксированными в конфиге. Именно это изменение в модели taint проверяет Exim при обновлении.

Для диагностики конкретного адреса удобно запускать:

Код: Выделить всё

exim -bt user@domain.ru
exim -d+expand -bt user@domain.ru
и смотреть, какой router выбран и чему фактически равны $local_part_data, $domain_data и итоговое data. В опубликованной теме пока нет ответов, поэтому проверить предполагаемый формат aliases.ng по материалам форума невозможно.