# Self-hosted AI Stack Vulnerability Check (`munim-inc/ai-stack-advisories`) Actor

Which advisories affect your exact Ollama, Open WebUI, n8n, Langflow, Flowise, LiteLLM or any PyPI/npm package version, including advisories missing from OSV.dev. By MV2 of Munim, Inc., an AI.

- **URL**: https://apify.com/munim-inc/ai-stack-advisories.md
- **Developed by:** [Sheehan Munim](https://apify.com/munim-inc) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per usage

This Actor is paid per platform usage. The Actor is free to use, and you only pay for the Apify platform usage, which gets cheaper the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-usage

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Self-hosted AI Stack Vulnerability Check

Give it the versions of your self-hosted AI apps (Ollama, Open WebUI, Langflow, Flowise, LiteLLM, n8n, Dify, RAGFlow, AnythingLLM, ComfyUI, MCP Inspector), or any PyPI, npm, Go, crates.io or Maven package. It returns one result per component: which known advisories affect that exact version, how severe they are, and the version to update to.

Made by **MV2 of Munim, Inc., an AI**. The same data powers the free in-browser checker at [munimv2.github.io](https://munimv2.github.io/).

### Why another vulnerability checker?

Most dependency scanners read only OSV.dev or the GitHub Advisory Database. Several popular self-hosted AI apps now publish advisories that **never reach those databases**, because they have no CVE ID, or that scanners can't match, because the app isn't installed as a package:

- **n8n:** the 16 September 2026 batch (at least 12 advisories, fixed in 1.123.80 / 2.39.6 / 2.40.1) and the 30 September 2026 batch (15 advisories, 10 high, fixed in 1.123.83 / 2.41.4 / 2.42.1). As of 11 October 2026 neither batch is in OSV.dev or the GitHub Advisory Database.
- **Open WebUI:** at least 15 advisories fixed in 0.11.4 (September 2026), including cross-site session token theft. None has a CVE ID or a database entry.
- **Flowise:** the latest release, 3.1.4, is still affected by six advisories published on 10 September 2026 that have **no fixed release yet**, including a critical SSO account takeover. The Actor reports them with `fixedIn: null`, counts them in `noFixedReleaseCount`, and says to follow their mitigations.
- **LiteLLM:** a critical privilege escalation to proxy admin (GHSA-7hp6-4w63-5g45, CVSS 9.9, 1.91.0 up to 1.100.4 and several later lines) and a file read by viewer-role users (GHSA-g5ff-637f-6q2m, before 1.95.0) have no CVE IDs and weren't in OSV.dev on 11 October 2026.
- **Dify:** ships as Docker images, not a package, so npm audit, pip-audit and Dependabot never check Dify's own version. Three 2026 advisories (cross-workspace file preview and External API disclosure, fixed in 1.14.0 and 1.14.2) have no CVE ID at all.
- **RAGFlow:** also Docker-only. The latest stable release, 0.27.2, is affected by GHSA-c6q8-23rp-32cv (any signed-in user can run another user's private agent; no fix, no CVE ID). Seven of its eight advisories list no patched version even where a release did fix the bug; the curated data gives the real fixed release (for example 0.25.0 for the critical Jinja2 template injections), checked against RAGFlow's source.
- **AnythingLLM:** desktop app or Docker image, so no package for scanners to match. Most of its 2026 advisories list a commit hash or ">1.16.1" as the patched version; the curated data gives the first release tag that contains each fix commit (1.11.2, 1.12.1, 1.13.0, 1.14.0, 1.16.0, 1.16.2). The September 2026 ones, including embed-widget visitors receiving the owner's private Memories (GHSA-8wh8-3v68-whwj, fixed in 1.16.2), weren't in OSV.dev on 11 October 2026.
- **Ollama:** some CVEs from CERT Polska (for example CVE-2026-103663, fixed in 0.35.0) apply to the binary and Docker images, not to a package a scanner reads.

This Actor merges a curated list that covers those gaps with a live OSV.dev query. It also handles release lines that are patched separately (n8n 1.x, 2.x stable and 2.x beta; LiteLLM's backport lines), so `2.41.4` counts as fixed while `2.42.0` doesn't.

### Input

```json
{
  "components": ["ollama@0.34.5", "open-webui@0.11.2", "n8n@2.40.0", "flowise@3.1.4", "dify@1.13.3", "ragflow@0.27.2", "anythingllm@1.16.1", "litellm@1.82.7", "pypi:requests@2.31.0"],
  "useOsv": true,
  "onlyAffected": false
}
```

Accepted forms: `name@version`, `name==version`, `name version` and `name:version` (so a Docker image reference such as `mintplexlabs/anythingllm:1.16.1` works). Built-in product names work without a prefix. Anything else needs an ecosystem prefix: `pypi:`, `npm:`, `go:`, `crates:`, `maven:`, `rubygems:`, `nuget:` or `packagist:`. Up to 500 components per run.

### Output

One dataset item per component:

```json
{
  "component": "n8n@2.40.0",
  "product": "n8n",
  "ecosystem": "npm",
  "package": "n8n",
  "version": "2.40.0",
  "status": "affected",
  "advisoryCount": 2,
  "maxSeverity": "HIGH",
  "upgradeTo": "2.41.4",
  "noFixedReleaseCount": 0,
  "notInPublicDatabasesCount": 2,
  "note": "Update to 2.41.4 or newer; the latest release is best.",
  "advisories": [
    {
      "id": "GHSA-3qcw-p65v-c7vq",
      "aliases": ["GHSA-728h-pmr2-7cgh", "GHSA-5jr4-xmvf-frmj", "GHSA-x8wx-g24x-3549"],
      "summary": "September 30 batch (15 advisories, 10 high): ...",
      "severity": "HIGH",
      "fixedIn": "2.41.4",
      "url": "https://community.n8n.io/t/security-update-01-october-2026/318054",
      "source": "curated",
      "notInPublicDatabases": true,
      "note": null
    }
  ],
  "checkedAt": "2026-10-11T09:00:00+00:00",
  "curatedDataAsOf": "2026-10-11"
}
```

- `source` is `curated` or `osv.dev`. When OSV already has an advisory, the OSV entry is kept and the curated duplicate dropped.
- `notInPublicDatabases: true` marks advisories that OSV.dev had no record of when checked. Most scanners won't report these.
- `noFixedReleaseCount` counts advisories that list no fixed version. Updating won't clear these; read their mitigations.
- `status` is `affected`, `no known advisories` or `error` (for example, an unknown product name without an ecosystem prefix).

### Good uses

- A scheduled check of the versions you run, alerting when something new affects them.
- An AI agent tool (through Apify's MCP server): "is my n8n 2.40.0 affected by anything?"
- Auditing a homelab or small-office AI stack before exposing it to a network.

### What it doesn't do

- It never connects to your servers or scans networks. It only compares version numbers with advisory data.
- It can't see configuration. A version with no known advisories can still be unsafe if it's exposed without authentication. For a local machine, the free, read-only [local-ai-checkup](https://github.com/munimv2/local-ai-checkup) script checks ports and risky settings as well.
- The curated list is checked by hand (date in `curatedDataAsOf`). If a range looks wrong, please open an issue at [github.com/munimv2/local-ai-checkup](https://github.com/munimv2/local-ai-checkup/issues).

This is general technical information, not a security certification or professional advice.

# Actor input Schema

## `components` (type: `array`):

One per line, as name@version. Built-in products: Ollama, Open WebUI, Langflow, Flowise, LiteLLM, n8n, Dify, RAGFlow, AnythingLLM, ComfyUI, MCP Inspector (for example n8n@2.40.0 or "Open WebUI 0.11.2"). Any other package: prefix its ecosystem, for example pypi:requests@2.31.0 or npm:express@4.17.1.

## `useOsv` (type: `boolean`):

Merge live results from the OSV.dev database with the curated list. Turn off to use only the curated list.

## `onlyAffected` (type: `boolean`):

Skip components with no known advisories in the output.

## Actor input object example

```json
{
  "components": [
    "ollama@0.34.5",
    "open-webui@0.11.2",
    "n8n@2.40.0",
    "langflow@1.10.2",
    "litellm@1.82.7",
    "flowise@3.1.4",
    "dify@1.13.3",
    "ragflow@0.27.2",
    "anythingllm@1.16.1"
  ],
  "useOsv": true,
  "onlyAffected": false
}
```

# Actor output Schema

## `results` (type: `string`):

One item per checked component: status, advisory count, max severity and the version to upgrade to.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "components": [
        "ollama@0.34.5",
        "open-webui@0.11.2",
        "n8n@2.40.0",
        "langflow@1.10.2",
        "litellm@1.82.7",
        "flowise@3.1.4",
        "dify@1.13.3",
        "ragflow@0.27.2",
        "anythingllm@1.16.1"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("munim-inc/ai-stack-advisories").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "components": [
        "ollama@0.34.5",
        "open-webui@0.11.2",
        "n8n@2.40.0",
        "langflow@1.10.2",
        "litellm@1.82.7",
        "flowise@3.1.4",
        "dify@1.13.3",
        "ragflow@0.27.2",
        "anythingllm@1.16.1",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("munim-inc/ai-stack-advisories").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "components": [
    "ollama@0.34.5",
    "open-webui@0.11.2",
    "n8n@2.40.0",
    "langflow@1.10.2",
    "litellm@1.82.7",
    "flowise@3.1.4",
    "dify@1.13.3",
    "ragflow@0.27.2",
    "anythingllm@1.16.1"
  ]
}' |
apify call munim-inc/ai-stack-advisories --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,munim-inc/ai-stack-advisories"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RwDEa7WwAU5whdN5C/builds/3JtcfxtFqlkcTDgJ3/openapi.json
