Debian Patches
Status for mistral/23.0.0-4
| Patch | Description | Author | Forwarded | Bugs | Origin | Last update |
|---|---|---|---|---|---|---|
| install-missing-files.patch | Install missing files | Thomas Goirand <zigo@debian.org> | not-needed | 2018-02-25 | ||
| Load_defaults_from_oslo.concurrency.patch | Load defaults from oslo.concurrency Under my env (ie: Debian packages), I've seen mistral-api trying to write under: . /var/lock/nova/oslo_read_shm_<HOSTNAME>_mistral-api . Why /var/lock/nova is a mistery, but I want to fix this. . This patch: . Ensures oslo.concurrency lockutils uses the value from the parsed config. oslo.concurrency registers its opts on import, so the option exists; call set_defaults *after* CONF(...) so we pick up any value from files. . Sets the lockutils default to the configured path so external locks (synchronized(external=True)) use the right directory. =================================================================== |
Thomas Goirand <zigo@debian.org> | no | 2025-10-03 | ||
| CVE-2026-97147_Fix_create-or-update_of_definitions_hijacking_other_projects_rows.patch | Fix create-or-update of definitions hijacking other projects' rows When several projects have a workflow or ad-hoc action definition with the same name, create_or_update_workflow_definition() and create_or_update_action_definition() looked the existing object up with an unordered first() over a query that isn't scoped to a single project (admin requests see all projects). The lookup could therefore return another project's definition, and since project_id is always rewritten to the current project on write (see model_base.register_secure_model_hooks), updating that object moved it into the caller's project. If the caller's project already had its own definition with that name, the move violated the (name, namespace, project_id) unique constraint and the resulting DBDuplicateEntry was raised at commit time, surfacing as an HTTP 500. . This intermittently broke the python-mistralclient functional job: the tests leaked 'wb.ac1' action definitions in two projects, after which every 'workbook-create' of a definition containing actions failed with a 500, depending on which project's row the DB returned first. . Look the existing definition up by the full unique key (name, namespace and project id of the current security context), which is the only row a subsequent write may collide with. Definitions of other projects are no longer touched, and the update targets the definition by id so the inner lookup is unambiguous. . diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index 6fa439be..0836d5a3 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-97147_Enforce_access_control_when_updating_action_definitions.patch | Enforce access control when updating action definitions update_action_definition() resolved the target by name with a query that, for a non-admin caller, also matches public definitions of other projects (the secure query includes scope=='public'). It then rewrote project_id to the caller on write, so a non-admin could modify and effectively steal another project's public ad-hoc action, and it had no guard against modifying a system action at the DB layer -- unlike update_workflow_definition(), which calls check_db_obj_access(). . Look the definition up in the caller's own project first so that, when several projects share a name, the caller's own object is updated, and call check_db_obj_access() to reject cross-project and system-action modifications by non-admins. The check is skipped when there is no authentication context, since 'mistral-db-manage populate' re-registers preinstalled ad-hoc actions through this path without one. . diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index 0836d5a3..087643d4 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-97147_Enforce_access_control_when_updating_workbooks_and_environments.patch | Enforce access control when updating workbooks and environments update_workbook() and update_environment()/create_or_update_environment() resolved the target with a query that returns public resources of other projects, and wrote to it without an ownership check. A non-admin project member could therefore modify (and, since the update sends scope, unpublish) another project's public workbook or environment. . Resolve the object within the caller's own project first and call check_db_obj_access() before writing, consistently with workflow and action definitions. The check is skipped when there is no authentication context. . update_workbook() was previously protected only transitively: a workbook update cascades into update_workflow_definition(), which is guarded, so the whole transaction rolled back. Making the workflow/action lookup project-scoped (previous change) removes that incidental protection, so the guard is now applied to the workbook row itself. . diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index 087643d4..ad060b4b 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-97147_Resolve_own-project_object_when_updating_code_sources_dynamic_actions.patch | Resolve own-project object when updating code sources / dynamic actions update_code_source() and update_dynamic_action_definition() resolved the target with a lookup that can return an object of another project (admins get an insecure cross-project lookup, and public objects are visible to any caller), then rewrote project_id to the caller on write. When several projects have an object with the same name, this could clobber or move the wrong one. . Resolve the object within the caller's own project first and apply check_db_obj_access(), consistently with workflow/action/workbook/environment updates. These resources are admin-only by default policy, so this is hardening / data integrity rather than a cross-tenant escalation. . diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index ad060b4b..fd536e34 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-97147_Resolve_own-project_object_Fix-test-DB-cleanup-for-code-sources-and-dynamic-actions.patch | Clean up code sources and dynamic actions in test DB cleanup DbTestCase._clean_db() never deleted code_sources and dynamic_action_definitions rows, so those two tables were not reset between tests. With the serial test run used by pkgos-dh_auto_test, rows left behind by the CVE-2026-97147 DB tests (a public code source "cs1" and dynamic actions referencing class names that do not exist in its content) leaked into later tests in the same process: listing actions built descriptors for them and failed with 500 "module 'cs1' has no attribute 'UpdatedClass'". . Delete both tables in _clean_db() for each of the two contexts it already iterates, dynamic action definitions before code sources to respect the foreign key order. =================================================================== |
Thomas Goirand <zigo@debian.org> | no | debian | 2026-10-01 | |
| CVE-2026-97147_Resolve_own-project_cron_trigger_in_create_or_update_cron_trigger.patch | Resolve own-project cron trigger in create_or_update_cron_trigger create_or_update_cron_trigger() looked the existing trigger up with a cross-project-capable query (public triggers are visible to any caller, admins get an insecure lookup), so it could update another project's trigger and move it into the caller's project. Resolve it within the caller's own project first, consistently with the other resources. . update_cron_trigger() is deliberately left unchanged: it is called by the periodic scheduler to update next-execution bookkeeping of triggers across all projects, and the cron trigger REST API exposes no update operation. diff --git a/mistral/db/v2/sqlalchemy/api.py b/mistral/db/v2/sqlalchemy/api.py index fd536e34..f6225ae9 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-93861_Only_allow_the_owner_of_a_resource_to_share_it.patch | Only allow the owner of a resource to share it Sharing a workflow (POST /v2/workflows/<id>/members) only verified that the caller could fetch the workflow definition and that its scope was private. The secure query that fetches the definition also returns resources shared with the caller through an accepted membership, so a project that a workflow was shared with - once it accepted the share - could re-share the owner's private workflow with an arbitrary third project. . The resulting ResourceMember row is stamped with the re-sharing project's id (the caller), not the owner's, so: . * the real owner can neither list nor delete that membership; * the third project can accept it and thereby read and execute the owner's private workflow, which the owner never shared with it; * only the re-sharing project, not the owner, can revoke it. . Reject the share unless the caller is the owner of the resource (wf_db.project_id == security.get_project_id()), with a 403. This does not affect the previously reported "pending" case, where the member cannot see the workflow yet and the fetch already fails with 404. . diff --git a/mistral/api/controllers/v2/member.py b/mistral/api/controllers/v2/member.py index 7dc0c805..1e22e7ba 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-93858_Fix_RCE_via_std.ssh_proxied_proxy_command.patch | Fix RCE via std.ssh_proxied proxy_command The std.ssh_proxied action passed a caller-supplied proxy_command straight to paramiko.ProxyCommand in execute_command_via_gateway. paramiko.ProxyCommand runs the string as a local subprocess on the executor host from its constructor - before any SSH authentication and independently of the SSH credentials, gateway or target supplied (a bad or empty key does not stop it). std.ssh_proxied is a built-in action, so any authenticated, project-scoped user could run arbitrary commands on every Mistral executor by submitting it through the action-execution API. This is a remote code execution vulnerability. . Gate proxy_command behind a new '[action_std_ssh] allowed_proxy_commands' allow-list (empty by default). execute_command_via_gateway now rejects, with an ActionException, any proxy_command whose exact value is not listed, before paramiko is invoked - so by default proxy_command is disabled and no local subprocess can be spawned. Operators who rely on it must add the exact command string to the option. The rejection reason reaches the caller thanks to the preceding change. . =================================================================== |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| CVE-2026-93860_Restrict_the_maintenance_endpoint_to_admins.patch | Restrict the maintenance endpoint to admins The root-level /maintenance resource read and changed Mistral's cluster maintenance state with no policy enforcement: the controller cleared the request context and called the service/DB layer directly. Switching the status to PAUSED is a cluster-wide operation that pauses running executions across every project, and reading the status exposes cluster-wide operational state, yet any authenticated token holder could reach both methods. . Add 'maintenance:get' and 'maintenance:update' policies (both default rule:admin_only) and enforce them in MaintenanceController.get() and put() before the request context is cleared, so only administrators can read or change the maintenance status. Operators can relax the rules in policy.yaml if needed. . diff --git a/mistral/api/controllers/maintenance.py b/mistral/api/controllers/maintenance.py index c24ef014..60a5fc05 100644 |
Arnaud Morin <arnaud.morin@gmail.com> | yes | debian upstream | upstream, pre-OSSA mailing list | 2026-10-01 |
| Fix_lock_tests_counting_all_named_locks.patch | Make the named lock unit tests assert on their own records The unit tests share one in-memory database per worker process, and the cleanup running after each test does not remove the rows of the named locks table. Engine tests process tasks asynchronously in background threads that hold named locks, so when such a thread is still running, the lock row exists while the next test runs. The LockTest tests count all the named lock records, so under a scheduler that dispatches tests to workers dynamically (stestr --dynamic) a leftover lock row from a previous engine test makes them fail. Assert on the records of the lock the test actually created instead, so that unrelated rows cannot affect them. =================================================================== |
Thomas Goirand <zigo@debian.org> | yes | 2026-10-15 | ||
| Run_unit_tests_against_the_fake_RPC_transport.patch | Run unit tests against the fake RPC transport A post-transaction engine operation, e.g. starting the next workflow of a task with items, runs in its own thread and performs an RPC cast. In unit tests that don't set up the fake transport (any test not based on EngineTestCase, e.g. the trigger service tests), such a cast lands on a real rabbit transport with no broker configured, and kombu retries the connection forever in the background. The thread being non-daemon, this blocks the exit of a dynamically dispatched test worker process even though every test already passed, hanging stestr run --dynamic at the end of the run. Engine tests already switch to the fake transport in EngineTestCase: do it once for every unit test in the shared test base instead, so that no test process can ever attempt a real RPC connection. This replaces the previous daemonization of the post-transaction thread, which the upstream reviewer declined, as it could leave an execution in a middle state at restart. =================================================================== |
Thomas Goirand <zigo@debian.org> | yes | upstream | 2026-10-23 | |
| Fix_leakage_of_auth_enable_state_in_unit_tests.patch | Fix leakage of auth_enable state in unit tests TestMembersController.setUp() sets auth_enable to True twice: once via override_config(), which restores the previous value on cleanup, and once via CONF.set_default(), which is never restored. Drop the latter, the override_config() call is enough, so that tests running later in the same process don't inherit the enabled authentication. Likewise, test_start_workflow() sets auth_enable with set_default() twice, once to create the trigger with authentication enabled and once to process it with authentication disabled, without ever restoring either: use override_config() for both, so that the state is restored on cleanup even when the test fails in the middle. A test relying on auth being disabled then misbehaves: the cron trigger service tests (whose module disables authentication at import time) end up calling security.add_trust_id() -> keystone.client(), which reads CONF.keystone_authtoken.auth_url. Those options are only registered when the WSGI pipeline instantiates the auth_token middleware, so the run fails with NoSuchOptError as soon as tests are dispatched to workers dynamically (e.g. with stestr --dynamic) and a worker that ran the leaking tests is handed such a test afterwards. =================================================================== |
Thomas Goirand <zigo@debian.org> | yes | 2026-10-23 | ||
| Enable_the_profiler_only_for_the_profiler_test.patch | Enable the profiler only for the profiler test The profiler tests enable profiling worker-wide with a module-level set_default: every worker process importing the module (which happens at discovery time in each dynamically dispatched worker) runs all its engine operations with profiling on. The engine operations run in background threads that may outlive their test, and whenever one of them traces after a later test set up its own notifier mock, that test observes the traces: test_no_profile_trace fails with a mock call count like "84 != 0" under stestr --dynamic, depending on which tests the worker ran before it. Enable the profiler with override_config in test_profile_trace only, so that no unrelated test ever initializes a profiler, and test_no_profile_trace only counts the traces of its own workflow, which are none, its profiler being disabled. =================================================================== |
Thomas Goirand <zigo@debian.org> | yes | 2026-10-23 | ||
| Restore_the_YAQL_engine_cached_by_the_disabled-c.patch | Restore the YAQL engine cached by the disabled-conversion tests The tests that disable the YAQL data conversion re-create the engine so that it picks up the overridden config options, and leave that engine cached in the yaql_expression module: it keeps serving the tests running after them in the same worker process, with the convertOutputData option still disabled, even though the per-test config overrides are restored on cleanup. A later test evaluating an expression then gets an unconverted result: DataFlowTest.test_context_view_eval_values fails with "'ValuesView(...)' is not an instance of list" under a scheduler dispatching tests to workers dynamically (stestr --dynamic), depending on which tests the worker ran before it. Restore the engine on cleanup, so that it is re-created with the restored options upon the next use. =================================================================== |
Thomas Goirand <zigo@debian.org> | no | 2026-10-23 |
All known versions for source package 'mistral'
- 23.0.0-4 (sid)
- 23.0.0-2 (forky)
- 20.0.0-2+deb13u1 (trixie, trixie-security)
- 15.0.0-1+deb12u1 (bookworm, bookworm-security)
