Skip to content

[security] Инъекция управляющих символов в провижининг DMS (alias target + bulk-import) #66

Description

@friench

Проблема

Пользовательский ввод с управляющими символами (\r, \n, \t, \0) может достичь провижининга docker-mailserver через argv-элемент и инъектировать лишние строки в конфиги DMS. Shell-инъекции нет (везде argv без shell), но newline-инъекция и path-traversal — есть.

3a. Alias target

src/http/validators/aliases.ts:11: target: z.string().min(1).max(1024)без проверки формата/newline (адрес алиаса при этом строго валидируется регэкспом). Значение идёт одним argv-элементом в setup alias add <address> <target> (dockerode-dms-client.ts:264), который дописывает строку в postfix-virtual.cf.

target с \n → инъекция второй virtual-map строки, мапящей адрес в другом домене на destination атакующего. Роут domain-scoped и доступен domain_adminобход domain-scope, кросс-тенант редирект почты. Как минимум — порча map-файла (DoS).

3b. Bulk-import минует строгие валидаторы

src/http/validators/import.ts:5-29 проверяет лишь min(), без email/domain-регэкспов и newline-проверок. src/domain/import/service.ts:76-123 вызывает сервисы напрямую, а те не перевалидируют формат:

  • mailbox address = "foo\nevil@registered.com"domainOf вернёт registered.com (проходит scope) → newline в setup email add / postfix-accounts.cf.
  • domain name = "../../etc" → сохраняется, затем попадает в cat ${DKIM_KEYS_DIR}/${domain}/${selector}.txt (dockerode-dms-client.ts:254) → path-traversal / чтение произвольного файла в контейнере DMS при регенерации DKIM. И ломает NginxService.regenerate() глобально (nginx-templates.ts бросает на кривом имени) — один плохой импортированный домен вешает генерацию vhost для всего стека.

Фикс

  1. Запретить /[\r\n\t\0]/ в alias target; валидировать как список адресов / devnull / @domain.
  2. В importDocumentSchema переиспользовать createDomainSchema / createMailboxSchema / createAliasSchema (или их регэкспы) — валидировать до провижининга.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingsecuritySecurity / hardening

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions