performing-scada-hmi-security-assessment

对 SCADA 人机界面(HMI, Human-Machine Interface)系统进行安全评估,识别基于 Web 的 HMI、瘦客户端配置、认证机制以及 HMI 与 PLC 之间通信信道中的漏洞,符合 IEC 62443 和 NIST SP 800-82 指南要求。

9 stars

Best use case

performing-scada-hmi-security-assessment is best used when you need a repeatable AI agent workflow instead of a one-off prompt.

对 SCADA 人机界面(HMI, Human-Machine Interface)系统进行安全评估,识别基于 Web 的 HMI、瘦客户端配置、认证机制以及 HMI 与 PLC 之间通信信道中的漏洞,符合 IEC 62443 和 NIST SP 800-82 指南要求。

Teams using performing-scada-hmi-security-assessment should expect a more consistent output, faster repeated execution, less prompt rewriting.

When to use this skill

  • You want a reusable workflow that can be run more than once with consistent structure.

When not to use this skill

  • You only need a quick one-off answer and do not need a reusable workflow.
  • You cannot install or maintain the underlying files, dependencies, or repository context.

Installation

Claude Code / Cursor / Codex

$curl -o ~/.claude/skills/performing-scada-hmi-security-assessment/SKILL.md --create-dirs "https://raw.githubusercontent.com/killvxk/cybersecurity-skills-zh/main/skills/performing-scada-hmi-security-assessment/SKILL.md"

Manual Installation

  1. Download SKILL.md from GitHub
  2. Place it in .claude/skills/performing-scada-hmi-security-assessment/SKILL.md inside your project
  3. Restart your AI agent — it will auto-discover the skill

How performing-scada-hmi-security-assessment Compares

Feature / Agentperforming-scada-hmi-security-assessmentStandard Approach
Platform SupportNot specifiedLimited / Varies
Context Awareness High Baseline
Installation ComplexityUnknownN/A

Frequently Asked Questions

What does this skill do?

对 SCADA 人机界面(HMI, Human-Machine Interface)系统进行安全评估,识别基于 Web 的 HMI、瘦客户端配置、认证机制以及 HMI 与 PLC 之间通信信道中的漏洞,符合 IEC 62443 和 NIST SP 800-82 指南要求。

Where can I find the source code?

You can find the source code on GitHub using the link provided at the top of the page.

SKILL.md Source

# 执行 SCADA HMI 安全评估

## 适用场景

- 评估 SCADA/DCS 环境中 HMI 系统的安全态势
- 评估基于 Web 的 HMI 界面中的常见 Web 漏洞
- 审计 HMI 认证、授权和会话管理
- 测试 HMI 与 PLC/RTU 之间的通信安全
- 为 IEC 62443 或 NERC CIP 合规评估做准备

**不适用于**在没有维护窗口和回滚计划的情况下测试生产中的活跃 HMI、PLC 级别协议分析(参见 performing-s7comm-protocol-security-analysis),或在非 OT 系统上进行通用 Web 应用测试。

## 前置条件

- 包含供应商、版本和网络配置详情的 HMI 系统清单
- 镜像生产 HMI 配置的实验室或测试环境(首选用于主动测试)
- 来自工厂运营部门的在维护窗口期间进行测试的授权
- NIST SP 800-82 和 IEC 62443 安全要求文档
- HMI 到 PLC 通信网段上的网络捕获能力

## 工作流程

### 步骤 1:评估 HMI 攻击面

```python
#!/usr/bin/env python3
"""SCADA HMI 安全评估工具。

根据 IEC 62443 和 NIST SP 800-82 要求,
评估 HMI 在认证、通信、配置和 Web 界面等方面的安全性。
"""

import json
import sys
from datetime import datetime
from typing import Dict, List

try:
    import requests
except ImportError:
    print("Install requests: pip install requests")
    sys.exit(1)


class HMISecurityAssessment:
    """对 SCADA HMI 系统进行安全评估。"""

    def __init__(self, hmi_info: dict):
        self.hmi_info = hmi_info
        self.findings = []
        self.checks_run = 0
        self.checks_passed = 0

    def check_authentication(self):
        """评估 HMI 认证机制。"""
        checks = [
            {
                "id": "AUTH-01",
                "name": "密码复杂度执行",
                "iec62443_ref": "ISA-62443-3-3 SR 1.7",
                "description": "HMI 必须执行最低密码复杂度要求",
                "test": "验证最小长度 >= 8,复杂度规则,历史记录 >= 5",
            },
            {
                "id": "AUTH-02",
                "name": "账户锁定策略",
                "iec62443_ref": "ISA-62443-3-3 SR 1.11",
                "description": "HMI 必须在登录失败尝试后锁定账户",
                "test": "验证 5 次失败尝试后锁定,锁定时长 >= 15 分钟",
            },
            {
                "id": "AUTH-03",
                "name": "已更改默认凭据",
                "iec62443_ref": "ISA-62443-3-3 SR 1.5",
                "description": "所有默认供应商凭据必须已更改",
                "test": "尝试使用已知供应商默认值登录(admin/admin,operator/operator)",
            },
            {
                "id": "AUTH-04",
                "name": "基于角色的访问控制",
                "iec62443_ref": "ISA-62443-3-3 SR 2.1",
                "description": "HMI 必须区分操作员、工程师和管理员角色",
                "test": "验证操作员角色无法访问工程功能",
            },
            {
                "id": "AUTH-05",
                "name": "会话超时执行",
                "iec62443_ref": "ISA-62443-3-3 SR 1.12",
                "description": "HMI 会话必须在不活跃后超时",
                "test": "验证操作员会话超时 <= 15 分钟,管理员 <= 5 分钟",
            },
            {
                "id": "AUTH-06",
                "name": "远程访问多因素认证",
                "iec62443_ref": "ISA-62443-3-3 SR 1.13",
                "description": "远程 HMI 访问需要 MFA",
                "test": "验证所有非本地 HMI 连接都强制执行 MFA",
            },
        ]

        print(f"\n--- 认证评估 ---")
        for check in checks:
            self.checks_run += 1
            print(f"  [{check['id']}] {check['name']}")
            print(f"    参考:{check['iec62443_ref']}")
            print(f"    测试:{check['test']}")

    def check_communication_security(self):
        """评估 HMI 到 PLC 的通信安全。"""
        checks = [
            {
                "id": "COMM-01",
                "name": "加密的 HMI-PLC 通信",
                "description": "HMI 与 PLC 之间的流量应使用加密协议(带 TLS 的 OPC UA)",
                "test": "捕获 HMI-PLC 流量并验证加密(Wireshark TLS 握手)",
            },
            {
                "id": "COMM-02",
                "name": "HMI 写命令认证",
                "description": "从 HMI 到 PLC 的写命令应经过认证",
                "test": "验证写操作需要操作员确认/认证",
            },
            {
                "id": "COMM-03",
                "name": "Web HMI 使用 HTTPS",
                "description": "基于 Web 的 HMI 界面必须使用 TLS 1.2+ 和有效证书",
                "test": "检查 TLS 版本、加密套件、证书有效性",
            },
            {
                "id": "COMM-04",
                "name": "未使用明文协议",
                "description": "Telnet、FTP、HTTP 不得用于 HMI 访问或管理",
                "test": "扫描 HMI 上的明文协议服务端口",
            },
        ]

        print(f"\n--- 通信安全评估 ---")
        for check in checks:
            self.checks_run += 1
            print(f"  [{check['id']}] {check['name']}")
            print(f"    测试:{check['test']}")

    def check_web_hmi_security(self):
        """评估基于 Web 的 HMI 中的常见 Web 漏洞。"""
        hmi_url = self.hmi_info.get("url", "")
        if not hmi_url:
            print(f"\n  [跳过] 未提供 Web HMI URL")
            return

        checks = [
            {
                "id": "WEB-01",
                "name": "跨站脚本(XSS)",
                "owasp": "A7:2017",
                "test": "在标签名称、告警消息的输入字段中测试 XSS 载荷",
            },
            {
                "id": "WEB-02",
                "name": "跨站请求伪造(CSRF)",
                "owasp": "A8:2013",
                "test": "验证状态更改操作(设定点更改)上的 CSRF 令牌",
            },
            {
                "id": "WEB-03",
                "name": "不安全的直接对象引用",
                "owasp": "A4:2013",
                "test": "操纵 URL 参数以访问其他用户的 HMI 视图",
            },
            {
                "id": "WEB-04",
                "name": "安全响应头",
                "test": "验证 X-Frame-Options、CSP、X-Content-Type-Options 头",
            },
            {
                "id": "WEB-05",
                "name": "特权文件系统访问(CVE-2025-0921)",
                "test": "检查 Ignition SCADA 是否存在通过项目文件触发的特权文件系统漏洞",
            },
        ]

        print(f"\n--- Web HMI 安全评估 ---")
        print(f"  目标:{hmi_url}")
        for check in checks:
            self.checks_run += 1
            print(f"  [{check['id']}] {check['name']}")
            print(f"    测试:{check['test']}")

    def check_hardening(self):
        """评估 HMI 操作系统和应用程序加固。"""
        checks = [
            {
                "id": "HARD-01",
                "name": "操作系统补丁级别",
                "test": "验证 HMI 操作系统在 SLA 内已打补丁(OT 通常为 90 天)",
            },
            {
                "id": "HARD-02",
                "name": "已禁用不必要的服务",
                "test": "验证未运行不必要的网络服务(如不需要的 RDP、SMB 等)",
            },
            {
                "id": "HARD-03",
                "name": "USB 端口限制",
                "test": "验证 HMI 终端上已阻止 USB 大容量存储",
            },
            {
                "id": "HARD-04",
                "name": "应用程序白名单",
                "test": "验证只有授权的 HMI 应用程序可以执行",
            },
            {
                "id": "HARD-05",
                "name": "已启用审计日志",
                "test": "验证操作员操作、登录事件和设定点更改已记录日志",
            },
        ]

        print(f"\n--- HMI 加固评估 ---")
        for check in checks:
            self.checks_run += 1
            print(f"  [{check['id']}] {check['name']}")
            print(f"    测试:{check['test']}")

    def generate_report(self):
        """生成评估报告。"""
        self.check_authentication()
        self.check_communication_security()
        self.check_web_hmi_security()
        self.check_hardening()

        print(f"\n{'='*70}")
        print("SCADA HMI 安全评估摘要")
        print(f"{'='*70}")
        print(f"日期:{datetime.now().isoformat()}")
        print(f"HMI:{self.hmi_info.get('name', '未知')}")
        print(f"供应商:{self.hmi_info.get('vendor', '未知')}")
        print(f"版本:{self.hmi_info.get('version', '未知')}")
        print(f"检查总数:{self.checks_run}")
        print(f"发现:{len(self.findings)}")


if __name__ == "__main__":
    assessment = HMISecurityAssessment(hmi_info={
        "name": "Plant-HMI-01",
        "vendor": "Siemens WinCC",
        "version": "7.5 SP2",
        "ip": "10.10.2.10",
        "url": "https://10.10.2.10:8080",
        "os": "Windows 10 LTSC 2021",
    })
    assessment.generate_report()
```

## 核心概念

| 术语 | 定义 |
|------|------|
| HMI | 人机界面(Human-Machine Interface),为操作员提供工业过程的可视化表示和控制 |
| Web HMI | 通过 HTTP/HTTPS 访问的基于浏览器的 HMI 界面,受标准 Web 漏洞影响 |
| 设定点(Setpoint) | 操作员可通过 HMI 更改的过程变量目标值;未授权更改可能导致过程中断 |
| 告警抑制(Alarm Suppression) | 攻击者禁用或隐藏 HMI 告警以掩盖恶意过程操纵的技术 |
| WinCC | 西门子 SCADA/HMI 软件,广泛部署于制造业和工艺行业 |
| CVE-2025-0921 | Ignition SCADA 特权文件系统漏洞,可通过恶意项目上传被利用 |

## 输出格式

```
HMI 安全评估报告
=================================
日期: YYYY-MM-DD
HMI: [名称] | 供应商: [供应商] | 版本: [版本]

按类别的发现:
  认证: [通过/失败数量]
  通信: [通过/失败数量]
  Web 安全: [通过/失败数量]
  加固: [通过/失败数量]

严重发现:
  1. [带整改措施的发现]

合规状态:
  IEC 62443 SL-T: [目标级别]
  IEC 62443 SL-A: [已达成级别]
```

Related Skills

triaging-security-incident

9
from killvxk/cybersecurity-skills-zh

使用 NIST SP 800-61r3 和 SANS PICERL 框架对安全事件进行初始分类,确定严重性、范围和所需响应行动。 按类型对事件分类,根据业务影响分配优先级,并路由到相应的响应团队。适用于事件分类、 安全告警分类、严重性评估、事件优先级排序或初始事件分析等请求场景。

triaging-security-incident-with-ir-playbook

9
from killvxk/cybersecurity-skills-zh

使用结构化 IR Playbook 对安全事件进行分类和优先排序,确定严重性、分配响应团队并启动适当的响应程序。

triaging-security-alerts-in-splunk

9
from killvxk/cybersecurity-skills-zh

在 Splunk Enterprise Security 中对安全告警进行分类,通过 SPL 查询和事件审查(Incident Review) 仪表板对重要事件进行严重性分类、调查、关联相关遥测并做出升级或关闭决策。 适用于 SOC 分析师需要处理关联搜索产生的告警队列、确定调查优先级, 或需要为交接给二/三级分析师记录分类决策时。

testing-websocket-api-security

9
from killvxk/cybersecurity-skills-zh

测试 WebSocket API 实现中的安全漏洞,包括 WebSocket 升级时缺少身份认证、跨站 WebSocket 劫持(Cross-Site WebSocket Hijacking,CSWSH)、通过 WebSocket 消息进行的注入攻击、输入校验不足、通过消息泛洪实施拒绝服务,以及通过 WebSocket 帧造成的信息泄露。测试人员使用 Burp Suite 拦截 WebSocket 握手和消息,构造恶意 payload,并测试 WebSocket 通道上的授权绕过。适用于 WebSocket 安全测试、WS 渗透测试、CSWSH 攻击或实时 API 安全评估相关请求。

testing-jwt-token-security

9
from killvxk/cybersecurity-skills-zh

在安全测试活动中,评估 JSON Web Token(JWT)实现中的密码学弱点、算法混淆攻击和授权绕过漏洞。

testing-api-security-with-owasp-top-10

9
from killvxk/cybersecurity-skills-zh

使用自动化和手工测试技术,针对 OWASP API 安全 Top 10 风险对 REST 和 GraphQL API 端点进行系统性评估。

performing-yara-rule-development-for-detection

9
from killvxk/cybersecurity-skills-zh

通过识别可执行文件中的唯一字节模式、字符串和行为指标,开发精准的 YARA 恶意软件检测规则,同时将误报率降至最低。

performing-wireless-security-assessment-with-kismet

9
from killvxk/cybersecurity-skills-zh

使用 Kismet 通过被动射频监控进行无线网络安全评估,检测流氓接入点(Rogue AP)、隐藏 SSID、弱加密和未授权客户端。

performing-wireless-network-penetration-test

9
from killvxk/cybersecurity-skills-zh

执行无线网络渗透测试,通过捕获握手包、破解 WPA2/WPA3 密钥、检测流氓接入点以及使用 Aircrack-ng 和相关工具测试无线网络分段,评估 WiFi 安全性。

performing-windows-artifact-analysis-with-eric-zimmerman-tools

9
from killvxk/cybersecurity-skills-zh

使用 Eric Zimmerman 的开源 EZ Tools 套件(包括 KAPE、MFTECmd、PECmd、LECmd、JLECmd 和 Timeline Explorer)执行全面的 Windows 取证制品分析,解析注册表 hive、预取文件、事件日志和文件系统元数据。

performing-wifi-password-cracking-with-aircrack

9
from killvxk/cybersecurity-skills-zh

在授权无线安全评估中捕获 WPA/WPA2 握手包,并使用 aircrack-ng、hashcat 和字典攻击进行离线密码破解, 以评估密码短语强度和无线网络安全状况。

performing-web-cache-poisoning-attack

9
from killvxk/cybersecurity-skills-zh

在授权安全测试期间,通过未纳入缓存键的头部和参数毒化缓存响应,利用 Web 缓存机制向其他用户投递恶意内容。