· intuitem · News · 6 min read
What's New in CISO Assistant — Week 34, 2026 (v3.21.1 – v3.21.2)
A SCIM account-takeover chain closed, the IAM permission engine rewritten on querysets to lift a hard scaling ceiling, a new aggregated MCP architecture with HTTP transport, and a streamlined approval management interface. Plus manual score overrides, per-template email toggles, and the ISO 27701:2025 outline.
Two patches on the v3.21 line: v3.21.1 on August 17 and v3.21.2 on August 20. Week 33 had no releases, so this edition picks up where the v3.21.0 minor left off.
The headline items are less visible than last cycle’s epics but matter more operationally — a security fix worth upgrading for, and a rewrite of how permissions are evaluated.
Security
- SCIM setup hardening — SCIM could adopt a pre-existing local account by bare email match and, in the same request, rewrite that account’s email address. An unauthenticated password-reset request would then deliver the reset to the new — attacker-controlled — address, completing a takeover. Two changes close this: on first-time adoption by email match, when no
externalIdmatch exists yet, SCIM no longer writesuser.emailoruserNameuntil a later sync matches on the IdP’s own stable identifier; and SCIM-managed accounts are no longer treated as local, so password login and password reset are closed off for them entirely unlesskeep_local_loginis set. SSO must now be enabled before SCIM tokens can be created, and SSO cannot be disabled while SCIM-managed accounts would be left without local-login access (PR #4658). Thanks to @melinoix.
If you run SCIM provisioning, this is the upgrade to prioritize.
Performance & Scale
- IAM permission checks moved to querysets — Permission checks previously materialized a raw list of accessible object UUIDs and filtered with
id__in. That breaks outright past roughly 65,536 entries on PostgreSQL — SQLite has a comparable limit — and it was wasteful even below the ceiling, since checking permission on a single object fetched the IDs of every accessible object first. This release is the first step away from that: a newFolder.descendantsmany-to-many field materializes the folder tree so ancestors and descendants resolve in linear time without recursive CTEs the Django ORM can’t express, and five coreRoleAssignmentmethods now return querysets that can be filtered, ordered and paginated. A migration backfills the new table from the existing folder tree (PR #4364). Thanks to @monsieurswag. - Audit log pruning on a schedule — Audit log pruning now runs once every three hours rather than on its previous cadence (PR #4657). Thanks to @MTG-Thomas.
AI & Integrations
- New aggregated MCP architecture — The MCP server was rebuilt around an aggregated design: HTTP transport with configurable security, authentication, stateless and JSON options; a read-only mode; generic object listing and retrieval; and exact counting with filtering and grouping. Pagination controls, result totals, response limits and truncation guidance keep large result sets from flooding the model’s context — the stated goal being broader coverage at a lower token cost. Paginated audits and assessments now retrieve completely, result-count messages are standardized, and evaluation tooling was added for model tool selection and multi-turn interactions. MCP setup documentation was expanded to match (PR #4648). Thanks to @ab-smith.
New Features
- Streamlined approval management — A dedicated interface for validation flows, with views for received, sent, history and all requests. Inbox counts, filtering and empty states make the queue legible; flow cards show status, deadline, linked item, notes and the actions available; and approve, reject, revoke, drop, request-changes and resubmit are all first-class actions with confirmation dialogs and clear feedback. Invalid status transitions are rejected with explicit validation errors. Localized relative timestamps and standardized status colors, labels and icons round it out, in English and French (PR #4650). Thanks to @ab-smith.
- Manual override of question-driven scores — On audits where the score is computed from questionnaire answers, auditors can now pin a manual score when they need to deviate. Turning on “Override score” unlocks the field and stops recomputation; turning it off hands control back to the answers. Boundaries are validated, a warning surfaces when the manual and calculated scores diverge, imports and exports preserve the distinction — a filled-in scoring template counts as an override — and the setting survives assessment cloning. Respondents never see the toggle (PR #4577). Thanks to @Mohamed-Hacene.
- Per-template email toggles — Every mail template under Settings → Templates now has an enable/disable switch, all on by default, with a confirmation modal for core mails. Turning off “Welcome” stops the welcome mail on user creation; turning off “Password reset” silences that flow while the UI still reports success (PR #4675). Thanks to @Axxiar.
- Audit link modes for entity assessments — The data wizard now offers link-mode options when creating an entity assessment, so an audit can be either copied or moved into the entity’s folder (PR #4649). Thanks to @tchoumi313.
- Optional author columns on assessments — Assessment tables can now show an authors column (PR #4647). Thanks to @nas-tabchiche.
- Incidents in analytics, conditionally — Incident data is surfaced in analytics only when the incidents feature is enabled (PR #4651). Thanks to @Axxiar.
- Unassigned filter on evidences — The evidence assignee filter gained a null option, so unassigned evidence can be isolated (PR #4302). Thanks to @martinzerty.
Framework & Library Updates
- ISO 27701:2025 outline — The privacy information management framework arrives as a structured catalog covering PIMS clauses, PII controller and processor requirements and the shared information-security controls, with framework metadata, scoring definitions and implementation groups. The libraries view also gained a quick filter for TTP catalogs (PR #4663). Thanks to @ab-smith.
- CyFun 2025 ↔ ISO 27001 mapping — A mapping between the CyFun 2025 framework and ISO 27001 (PR #4646). Thanks to @tarkadia.
check_library_v2.py— A rewritten library validation tool for contributors building or updating framework libraries (PR #2371). Thanks to @tarkadia.
Bug Fixes
OPTIONSno longer returns 500 — Every endpoint served byBaseModelViewSetanswered 500 onOPTIONSwhile answering 200 onGET. DRF resolvesOPTIONSthroughSimpleMetadata.determine_actions(), which callsget_serializer()while the view action is"metadata"— an action the serializer factory didn’t map, so it returnedNoneand DRF called it. The factory now resolves"metadata"to the write serializer, which is the shapeOPTIONSshould be describing, with a parametrised regression test across folders, assets and perimeters (PR #4667). Thanks to @luantaraschi.- BaFin-compliant DORA package names — The DORA Register of Information export’s EBA naming option produced ZIP names with an identifier-type prefix and an ISO-like timestamp containing
TandZ, which BaFin MVP rejects; the archive also kept an NBB-style top-level directory. EBA exports now build a single compliant stem from the report-subject identifier and consolidation level, two-letter country, taxonomy version and module, prior-year reference date and a 17-digitYYYYMMDDHHMMSSmmmtimestamp, applied consistently to the archive root, every member and the response header. The frontend filename preview mirrors it. NBB naming is unchanged (PR #4604). Thanks to @mvanhorn. - Canary release regression fixed — A regression affecting the canary release channel was resolved (PR #4660). Thanks to @ab-smith.
Internationalization
- Italian translations updated — A refresh of the Italian locale (PR #4640). Thanks to @LoZio.
Two more architecture decision records also landed this cycle, documenting the move from Poetry to uv (PR #4659, thanks to @Axxiar) and the service account design shipped in v3.21.0 (PR #4665, thanks to @tchoumi313).
Welcome to new contributors @MTG-Thomas and @luantaraschi, who made their first contributions in v3.21.1 and v3.21.2 respectively. For full details, check out the v3.21.1 and v3.21.2 release notes on GitHub.