Back to skill

Security audit

sber-business

Security checks for vulnerabilities and agentic risk

Overview

This skill performs a disclosed SberBusiness banking integration with local credential storage and optional notification exports, but users should treat it as sensitive financial software.

Install only if you intend to connect this machine to SberBusiness. Review every notification channel before enabling it, prefer private or internal endpoints, enable privacy masking where appropriate, and protect ~/.openclaw/secrets because it stores encrypted banking credentials and certificates.

Vulnerability Patterns
  • Skill Instruction HijackingAlters the agent's session goals or safety constraints when the skill loads
  • Agent Memory PoisoningWrites attacker-controlled rules into memory that affect later sessions
  • Remote Payload Retrieval and ExecutionFetches external code whose behavior can change after review
  • Embedded Malicious CodeShips malicious scripts inside the skill and executes them locally
  • Unauthorized Access and Privilege EscalationObtains permissions beyond the task's legitimate needs
Vulnerability Patterns
  • Data ExfiltrationExternal Transmission, Env Variable Harvesting, File System Enumeration
  • Privilege EscalationExcessive Permissions, Sudo/Root Execution, Credential Access
  • Rogue AgentSelf-Modification, Session Persistence
  • Trigger AbuseOverly Broad Trigger, Shadow Command Trigger, Keyword Baiting Trigger
  • Taint TrackingDirect Taint Flow, Variable-Mediated Taint Flow, Credential Exfiltration Chain
Findings (45)

Tainted flow: 'cmd_cert' from input (line 258, user input) → subprocess.run (code execution)

Critical
Category
Data Flow
Content
"openssl", "pkcs12", "-in", str(p12_path), "-clcerts", "-nokeys",
            "-out", str(cert_tmp), "-passin", "stdin"
        ]
        res = subprocess.run(cmd_cert, input=p12_password.encode("utf-8"), capture_output=True)
        if res.returncode != 0:
            print(f"❌ Неверный пароль от .p12 или повреждённый файл: {res.stderr.decode()}", file=sys.stderr)
            sys.exit(1)
Confidence
90% confidence
Finding
External input (network, user) flows to a code execution sink. This enables remote code execution or command injection.

Tainted flow: 'cmd_key' from input (line 268, user input) → subprocess.run (code execution)

Critical
Category
Data Flow
Content
"openssl", "pkcs12", "-in", str(p12_path), "-nocerts", "-nodes",
            "-out", str(key_tmp), "-passin", "stdin"
        ]
        res = subprocess.run(cmd_key, input=p12_password.encode("utf-8"), capture_output=True)
        if res.returncode != 0:
            print(f"❌ Ошибка извлечения закрытого ключа: {res.stderr.decode()}", file=sys.stderr)
            sys.exit(1)
Confidence
90% confidence
Finding
External input (network, user) flows to a code execution sink. This enables remote code execution or command injection.

Tp4

High
Category
MCP Tool Poisoning
Confidence
95% confidence
Finding
Описание обещает широкий набор возможностей, включая онбординг, защищенное хранилище, платежные документы, подпись и PDF-выгрузку. Представленный код фактически занимается другой, более узкой задачей: опрашивает Sber API на предмет новых операций по счету, получает текущий остаток и рассылает уведомления во внешние каналы. Совпадает лишь часть про каналы уведомлений и остатки. При этом основная наблюдаемая функция куска — мониторинг транзакций с push/webhook-оповещением — не отражена как самостоятельная ключевая возможность в описании, а большинство заявленных возможностей в коде отсутствуют. Поэтому описание и поведение существенно расходятся.

Tp4

High
Category
MCP Tool Poisoning
Confidence
92% confidence
Finding
Описание частично совпадает с кодом в части работы со Сбер API, использования защищенного vault и получения остатков. Однако значительная часть заявленных возможностей в данном фрагменте отсутствует: нет онбординга, уведомительных каналов, подписи, PDF-выгрузки со штампом банка и явной обработки платежек. Вместо этого код в основном занимается безопасным хранением/обновлением токенов и чтением клиентских банковских данных (client-info, accounts, summary, transactions, increment). Это указывает на заметное расхождение между заявленным назначением и фактическим поведением данного куска кода.

Tp4

High
Category
MCP Tool Poisoning
Confidence
94% confidence
Finding
Описание существенно шире фактического поведения. В коде присутствуют только операции, связанные с платежами: вызов MCP JSON-RPC, поиск контрагента, создание черновика платёжки и получение статуса, плюс генерация ссылки на подписание. Упоминание Zero-Knowledge Vault частично соответствует только механизму авторизации/получения mTLS через SberAPI, но основная часть заявленных возможностей отсутствует. Поэтому описание не отражает реальный объем реализованного функционала и является несоответствующим.

Tp4

High
Category
MCP Tool Poisoning
Confidence
97% confidence
Finding
Описание значительно шире и обещает полноценную интеграцию со СберБизнес API и бизнес-функции банка, тогда как представленный код ограничен исключительно управлением локальным vault для секретов и сертификатов. Совпадает только часть про Zero-Knowledge Vault с AES-256-GCM. Основное фактическое назначение данного фрагмента — безопасное хранение/импорт учетных данных и TLS-материалов, а не выполнение банковских API-операций или уведомлений. Поэтому описание неадекватно отражает реальное поведение этого куска кода.

Lp1

High
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The script performs outbound network communication to Telegram, MAX, Discord, Slack, arbitrary webhooks, and the Sber API, but the finding indicates this capability is not declared in the skill permissions. In a banking context, undeclared network access is security-relevant because it enables transmission of sensitive transaction data to external services without platform-level visibility or consent enforcement.

Lp1

High
Category
MCP Least Privilege
Confidence
94% confidence
Finding
The script performs outbound network communication to Telegram, MAX, Discord, Slack, arbitrary webhooks, and the Sber API, but the finding indicates this capability is not declared in the skill permissions. In a banking context, undeclared network access is security-relevant because it enables transmission of sensitive transaction data to external services without platform-level visibility or consent enforcement.

Credential Access

High
Category
Privilege Escalation
Content
def pack_profile_from_disk(profile: str, env_path: Path, cert_dir: Path, account: str = "", inn: str = "", org_name: str = "") -> None:
    """Упаковывает существующие открытые файлы .env и .pem в зашифрованный .vault."""
    if not env_path.exists():
        raise FileNotFoundError(f"Файл окружения {env_path} не найден")
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
def pack_profile_from_disk(profile: str, env_path: Path, cert_dir: Path, account: str = "", inn: str = "", org_name: str = "") -> None:
    """Упаковывает существующие открытые файлы .env и .pem в зашифрованный .vault."""
    if not env_path.exists():
        raise FileNotFoundError(f"Файл окружения {env_path} не найден")
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
def pack_profile_from_disk(profile: str, env_path: Path, cert_dir: Path, account: str = "", inn: str = "", org_name: str = "") -> None:
    """Упаковывает существующие открытые файлы .env и .pem в зашифрованный .vault."""
    if not env_path.exists():
        raise FileNotFoundError(f"Файл окружения {env_path} не найден")
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
def pack_profile_from_disk(profile: str, env_path: Path, cert_dir: Path, account: str = "", inn: str = "", org_name: str = "") -> None:
    """Упаковывает существующие открытые файлы .env и .pem в зашифрованный .vault."""
    if not env_path.exists():
        raise FileNotFoundError(f"Файл окружения {env_path} не найден")
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Credential Access

High
Category
Privilege Escalation
Content
args = parser.parse_args()
    if args.cmd == "pack":
        env_file = Path(args.env) if args.env else SECRETS_DIR / f"sber_{args.profile}.env"
        cert_dir = Path(args.cert_dir) if args.cert_dir else SECRETS_DIR / f"sber_{args.profile}"
        if not cert_dir.exists() and (SECRETS_DIR / "sber").exists():
            cert_dir = SECRETS_DIR / "sber"
Confidence
60% confidence
Finding
Code accesses credential files (SSH keys, AWS credentials, etc.). This could indicate credential theft attempts.

Missing User Warnings

Medium
Confidence
93% confidence
Finding
The README promotes sending near-real-time banking events, balances, and transaction details to third-party channels such as Telegram, Discord, Slack, and generic webhooks, but it does not clearly warn that this discloses regulated financial data to external providers outside the bank environment. Although it mentions HTTPS and optional masking, the documented feature set still encourages broad transmission of sensitive metadata like counterparty names, INN, BIC, payment purpose, and balances, creating confidentiality and compliance risks if users enable these channels without understanding the exposure.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Session Persistence

Medium
Category
Rogue Agent
Content
- https://discord.com (optional Discord webhooks)
    - https://hooks.slack.com (optional Slack webhooks)
  filesystem-access:
    - ~/.openclaw/secrets/ (read/write encrypted AES-256-GCM .vault files)
    - /dev/shm (ephemeral in-memory mTLS certificates for active HTTPS calls, wiped immediately)
    - /etc/machine-id (read-only for hardware-bound HKDF key derivation)
---
Confidence
93% confidence
Finding
The skill explicitly persists highly sensitive banking secrets in local storage under ~/.openclaw/secrets/ and derives encryption material from machine-bound state. Even if encrypted, this creates long-lived secret material and expands the consequences of local compromise, backup leakage, permission mistakes, or misuse by other tools on the same host.

Vague Triggers

Medium
Confidence
95% confidence
Finding
The activation examples include broad natural-language phrases like 'Хочу подключить Сбер' and 'Настрой СберБизнес API', which can match ordinary conversation and trigger a high-privilege workflow. In this skill, unintended invocation is more dangerous because the skill has exec capability and handles sensitive banking setup, secrets, and external notifications.

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Ae4

Medium
Category
analysis-evasion
Confidence
80% confidence
Finding
Suspicious Unicode normalization or mixed-script content

Missing User Warnings

Medium
Confidence
95% confidence
Finding
The document promotes sending bank transaction and balance data to third-party messaging channels and emphasizes convenience/speed, but it does not warn that this data is financially sensitive and may be exposed to external platform operators, compromised bots, group members, or retention policies outside the bank environment. In the context of banking notifications, this omission can lead users to exfiltrate account activity to less-controlled systems without informed consent or data-minimization safeguards.

Missing User Warnings

Medium
Confidence
98% confidence
Finding
The custom webhook section explicitly instructs users to send financial event data to any arbitrary external URL without warning about trust boundaries, endpoint ownership, TLS validation, logging exposure, or downstream storage of sensitive banking data. This creates a real risk of deliberate or accidental exfiltration of transaction data to untrusted infrastructure, especially because webhook integrations are easy to misconfigure and hard to audit.

External Transmission

Medium
Category
Data Exfiltration
Content
},
  "webhook": {
    "enabled": false,
    "url": "https://api.mycompany.ru/webhooks/sber",
    "secretHeader": "X-Auth-Token",
    "secretValue": "YOUR_SECRET_TOKEN"
  }
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

External Transmission

Medium
Category
Data Exfiltration
Content
},
  "webhook": {
    "enabled": false,
    "url": "https://api.mycompany.ru/webhooks/sber",
    "secretHeader": "X-Auth-Token",
    "secretValue": "YOUR_SECRET_TOKEN"
  }
Confidence
50% confidence
Finding
Data is being sent to an external URL. This could be legitimate telemetry or data exfiltration. Manual review is recommended.

Missing User Warnings

Medium
Confidence
96% confidence
Finding
The script sends banking transaction details, counterparties, account identifiers, and balances to third-party messaging and webhook services. Even though webhook URLs are forced to HTTPS, there is no in-file user-facing warning, consent flow, minimization by default, or restriction against exporting highly sensitive financial data to external processors.

External Transmission

Medium
Category
Data Exfiltration
Content
import urllib.request
    if not token or not chat_id:
        return False
    url = f"https://api.telegram.org/bot{token}/sendMessage"
    payload = json.dumps({"chat_id": chat_id, "text": text, "parse_mode": "HTML"}, ensure_ascii=False).encode("utf-8")
    req = urllib.request.Request(url, data=payload, method="POST", headers={"Content-Type": "application/json"})
    try:
Confidence
95% confidence
Finding
The code explicitly transmits notification content to Telegram over the public internet. In this skill, the message body contains sensitive banking event data and may include account numbers, tax IDs, counterparties, payment purpose, and balances, making the external transmission itself security-significant even if TLS is used.

Static analysis

No suspicious patterns detected.