Проблема
Пользовательский ввод с управляющими символами (\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 для всего стека.
Фикс
- Запретить
/[\r\n\t\0]/ в alias target; валидировать как список адресов / devnull / @domain.
- В
importDocumentSchema переиспользовать createDomainSchema / createMailboxSchema / createAliasSchema (или их регэкспы) — валидировать до провижининга.
Проблема
Пользовательский ввод с управляющими символами (
\r,\n,\t,\0) может достичь провижининга docker-mailserver через argv-элемент и инъектировать лишние строки в конфиги DMS. Shell-инъекции нет (везде argv без shell), но newline-инъекция и path-traversal — есть.3a. Alias
targetsrc/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вызывает сервисы напрямую, а те не перевалидируют формат:address = "foo\nevil@registered.com"→domainOfвернётregistered.com(проходит scope) → newline вsetup email add/postfix-accounts.cf.name = "../../etc"→ сохраняется, затем попадает вcat ${DKIM_KEYS_DIR}/${domain}/${selector}.txt(dockerode-dms-client.ts:254) → path-traversal / чтение произвольного файла в контейнере DMS при регенерации DKIM. И ломаетNginxService.regenerate()глобально (nginx-templates.tsбросает на кривом имени) — один плохой импортированный домен вешает генерацию vhost для всего стека.Фикс
/[\r\n\t\0]/в aliastarget; валидировать как список адресов /devnull/@domain.importDocumentSchemaпереиспользоватьcreateDomainSchema/createMailboxSchema/createAliasSchema(или их регэкспы) — валидировать до провижининга.