[CL-SEC] аудит Q2 CRITICAL#3: убрать _skipOtp из публичного requestPayout (cron → requestScheduledPayout) #784
No reviewers
Labels
No labels
ci-failing
duplicate
needs-rebase
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
europa-tech-srl/europatech!784
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "feature/claude-sec-q2-skipotp"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
CRITICAL #3 квартального аудита (SEC-Q2-2026).
_skipOtpбыл полемdata-объектаrequestPayout(форма HTTP-body). Хотя Zod-схема срезает его на HTTP-входе, любой service-layer caller мог передать_skipOtp: trueи обойти OTP + 24h IBAN-cooldown.dataв явный internal-параметрrequestPayout(..., { skipOtp }).requestScheduledPayout()— единственный санкционированный путь обхода (cron). Re-export черезincome-payout/index.ts+income.service.ts.payoutSchedule.service.ts) переведён наrequestScheduledPayout.requestPayoutтеперь игнорирует протащенный_skipOtp→ OTP/cooldown обязательны.Зачем
Defense-in-depth: даже если внутренний код (будущий рефактор, worker) передаст
_skipOtpв data-объекте, обход невозможен — bypass только через явную, greppable функцию.План тестирования
SEC-Q2: public requestPayout ignores smuggled _skipOtp(income-payout.test),BANK-SEC-6b(deep-payment-audit),requestScheduledPayout bypasses OTP(BANK-SEC-6).vitestзатронутые: 192/192.tsc --noEmitclean,eslint --max-warnings 0clean. pre-push зелёный.Где могу ошибаться
requestScheduledPayoutсигнатура наследует типdataотrequestPayoutчерезParameters<>— cron передаётmaxAmount, поле осталось в публичном типе (нужно scheduled-пути).