Token导航 LogoToken导航

Agent Skill · 开发

roth-detection-engineering(罗斯检测工程)

roth-detection-engineering 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中需要围绕仓库状态、代码变更或协作事项进行整理时使用。可结合来源仓库、安装命令和原始 README 继续核验具体用法。安装前建议确认权限范围、维护状态,以及是否会触发联网、命令执行或文件读写。

roth-detection-engineering 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为需要联网;许可证信息还不明确,第三方扫描已通过,按安装量在开发类的 21,746 个 Skill 里排第 21,184。

总安装 194周安装 8GitHub Stars 6下载 63核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:roth-detection-engineering(罗斯检测工程)
来源仓库:https://github.com/copyleftdev/sk1llz
仓库路径:skills/roth-detection-engineering
安装命令:
npx skills add https://github.com/copyleftdev/sk1llz --skill roth-detection-engineering
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/copyleftdev/sk1llz --skill roth-detection-engineering

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

roth-detection-engineering 用于处理 GitHub 仓库、Issue、Pull Request 和代码协作信息,适合在 Codex、Claude、Cursor、Gemini CLI 中围绕仓库状态进行整理时使用。

它适用于检测工程开发、代码协作管理或问题追踪等场景,可辅助 Agent 处理开发流程中的协作需求。通过 npx skills add 命令从指定 GitHub 仓库安装,具体用法需结合原始 README 进一步确认。安装前建议确认权限范围和维护状态,注意可能触发联网或文件读写操作,避免影响系统安全。

适用宿主包括 Codex、Claude、Cursor、Gemini CLI,接入前应确认版本、权限和运行环境要求。

来源仓库内路径:skills/roth-detection-engineering

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/copyleftdev/sk1llz --skill roth-detection-engi…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要需要联网,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

roth-detection-engineering 怎么安装?

在终端执行 npx skills add https://github.com/copyleftdev/sk1llz --skill roth-detection-engineering。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

roth-detection-engineering 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

roth-detection-engineering 需要什么权限?

权限级别是需要联网。该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

roth-detection-engineering 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

roth-detection-engineering 用的人多吗?

公开数据是累计安装 194 次,近一周安装 8 次,下载 63 次,GitHub 6 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

roth-detection-engineering 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。

先想清楚的地方

  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。

不太适合

  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
roth-detection-engineering

罗斯检测工程 · 本页

1946需要联网未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Florian Roth — Detection Engineering⁠‍⁠​‌​‌​​‌‌‍​‌​​‌​‌‌‍​​‌‌​​​‌‍​‌​​‌‌​​‍​​​​​​​‌‍‌​​‌‌​‌​‍‌​​​​​​​‍‌‌​​‌‌‌‌‍‌‌​​​‌​​‍‌‌‌‌‌‌​‌‍‌‌​‌​​​​‍​‌​‌‌‌‌‌‍​‌​​‌​‌‌‍​‌‌​‌​​‌‍‌​‌​‌‌‌​‍​​‌​‌​​​‍‌‌‌​‌​‌‌‍‌‌​‌‌‌​​‍​‌​‌​​‌​‍‌‌‌‌​‌​​‍​​‌​​‌‌​‍​​​​‌​‌​‍‌​‌‌​​‌​⁠‍⁠

Overview

Florian Roth is CTO of Nextron Systems and creator of some of the most influential detection tools in security: the Sigma rule format, extensive YARA rule sets, and the THOR APT scanner. His work has made detection logic portable, shareable, and accessible to the community.

References

Core Philosophy

"Detection should be shareable."
"One rule format to rule them all."
"The community is stronger together."

Roth's insight: detection logic shouldn't be locked to a single SIEM. Sigma allows defenders to write once and deploy everywhere, accelerating community-wide defense.

Key Contributions

Sigma Rules

Generic signature format for SIEM systems. Write detection logic once, convert to any SIEM query language.

YARA Rules

Binary pattern matching for malware detection. Extensive rule sets for threat hunting.

THOR Scanner

APT scanner that brings professional detection capabilities to incident response.

When Implementing

Always

  • Write Sigma rules for portability
  • Include MITRE ATT&CK tags
  • Document false positives
  • Test rules before deployment
  • Share rules with the community
  • Version control your rules

Never

  • Hard-code SIEM-specific syntax in shared rules
  • Deploy untested rules to production
  • Ignore false positive rates
  • Keep effective rules private
  • Skip metadata (author, date, references)

Prefer

  • Sigma over SIEM-specific queries
  • Behavioral patterns over exact strings
  • Community rules as starting points
  • Layered detection (multiple rules per technique)
  • Regular rule review and tuning

Implementation Patterns

Sigma Rule Anatomy

# sigma_rule_template.yml
# Complete Sigma rule with all recommended fields

title: Suspicious PowerShell Download Cradle
id: 3b6ab547-8ec2-4991-b9d2-2b06702a48d7    # UUID
status: experimental    # test | stable | deprecated
description: |
    Detects PowerShell download cradle patterns commonly used
    for malware delivery and living-off-the-land attacks.

references:
    - https://attack.mitre.org/techniques/T1059/001/
    - https://lolbas-project.github.io/

author: Florian Roth (Nextron Systems)
date: 2024/01/15
modified: 2024/02/20

tags:
    - attack.execution
    - attack.t1059.001
    - attack.defense_evasion
    - attack.t1140

logsource:
    category: process_creation
    product: windows

detection:
    selection_img:
        - Image|endswith: '\powershell.exe'
        - Image|endswith: '\pwsh.exe'
        - OriginalFileName:
            - 'PowerShell.EXE'
            - 'pwsh.dll'

    selection_commands:
        CommandLine|contains:
            - 'IEX'
            - 'Invoke-Expression'
            - 'DownloadString'
            - 'DownloadFile'
            - 'DownloadData'
            - 'Net.WebClient'
            - 'Start-BitsTransfer'
            - 'Invoke-WebRequest'
            - 'iwr '
            - 'curl '
            - 'wget '

    filter_legitimate:
        CommandLine|contains:
            - 'chocolatey'
            - 'update-help'
            - 'Microsoft.PowerShell'

    condition: all of selection_* and not filter_legitimate

falsepositives:
    - Legitimate administration scripts
    - Software deployment tools
    - Package managers (Chocolatey, etc.)

level: medium

fields:
    - CommandLine
    - ParentCommandLine
    - User
    - ComputerName

YARA Rule Anatomy

/*
    YARA Rule: Cobalt Strike Beacon
    Author: Florian Roth
    Date: 2024-01-15
    Reference: https://www.cobaltstrike.com/

    Detects Cobalt Strike beacon payloads in memory or files
*/

rule CobaltStrike_Beacon_Encoded
{
    meta:
        description = "Detects Cobalt Strike beacon"
        author = "Florian Roth"
        date = "2024-01-15"
        reference = "https://attack.mitre.org/software/S0154/"
        hash1 = "abc123..."
        score = 80

    strings:
        // XOR encoded config
        $config_start = { 00 01 00 01 00 02 }

        // Sleep mask
        $sleep_mask = { 48 89 5C 24 08 48 89 6C 24 10 }

        // Named pipe pattern
        $pipe = "\\\\.\\pipe\\msagent_" ascii wide

        // Default watermark (change for specific actors)
        $watermark = { 01 00 00 00 [4] 00 00 00 00 }

        // Reflective loader
        $reflective = "ReflectiveLoader" ascii

    condition:
        uint16(0) == 0x5A4D and    // MZ header
        filesize < 1MB and
        (
            ($config_start and $watermark) or
            ($sleep_mask and $pipe) or
            ($reflective and $pipe)
        )
}

rule Mimikatz_Memory_Strings
{
    meta:
        description = "Detects Mimikatz in memory"
        author = "Florian Roth"
        reference = "https://attack.mitre.org/software/S0002/"

    strings:
        $s1 = "sekurlsa::logonpasswords" ascii wide nocase
        $s2 = "sekurlsa::wdigest" ascii wide nocase
        $s3 = "sekurlsa::kerberos" ascii wide nocase
        $s4 = "lsadump::sam" ascii wide nocase
        $s5 = "lsadump::dcsync" ascii wide nocase
        $s6 = "privilege::debug" ascii wide nocase

        $author = "gentilkiwi" ascii wide
        $tool = "mimikatz" ascii wide nocase

    condition:
        3 of ($s*) or
        ($author and $tool)
}

Sigma to SIEM Conversion

# sigma_converter.py
# Convert Sigma rules to various SIEM formats

from dataclasses import dataclass
from typing import Dict, List, Optional
import yaml
import re

@dataclass
class SigmaRule:
    """Parsed Sigma rule"""
    title: str
    id: str
    status: str
    description: str
    logsource: Dict
    detection: Dict
    level: str
    tags: List[str]
    falsepositives: List[str]

    @classmethod
    def from_yaml(cls, yaml_content: str) -> 'SigmaRule':
        data = yaml.safe_load(yaml_content)
        return cls(
            title=data.get('title', ''),
            id=data.get('id', ''),
            status=data.get('status', 'experimental'),
            description=data.get('description', ''),
            logsource=data.get('logsource', {}),
            detection=data.get('detection', {}),
            level=data.get('level', 'medium'),
            tags=data.get('tags', []),
            falsepositives=data.get('falsepositives', [])
        )

class SigmaConverter:
    """Convert Sigma rules to SIEM queries"""

    def __init__(self, rule: SigmaRule):
        self.rule = rule

    def to_splunk(self) -> str:
        """Convert to Splunk SPL"""
        query_parts = []

        # Add index based on logsource
        if self.rule.logsource.get('product') == 'windows':
            query_parts.append('index=windows')

        # Process detection selections
        detection = self.rule.detection
        condition = detection.get('condition', '')

        for key, value in detection.items():
            if key == 'condition':
                continue

            if isinstance(value, dict):
                field_queries = self._convert_selection_splunk(value)
                query_parts.append(f"({' OR '.join(field_queries)})")

        # Combine with condition logic
        query = ' '.join(query_parts)

        # Add table formatting
        query += f"\n| table _time, ComputerName, User, CommandLine"

        return query

    def _convert_selection_splunk(self, selection: Dict) -> List[str]:
        """Convert selection to Splunk query parts"""
        queries = []

        for field, value in selection.items():
            # Handle modifiers
            if '|' in field:
                field_name, modifier = field.split('|')

                if modifier == 'endswith':
                    if isinstance(value, list):
                        queries.extend([f'{field_name}="*{v}"' for v in value])
                    else:
                        queries.append(f'{field_name}="*{value}"')

                elif modifier == 'contains':
                    if isinstance(value, list):
                        queries.extend([f'{field_name}="*{v}*"' for v in value])
                    else:
                        queries.append(f'{field_name}="*{value}*"')

                elif modifier == 'startswith':
                    if isinstance(value, list):
                        queries.extend([f'{field_name}="{v}*"' for v in value])
                    else:
                        queries.append(f'{field_name}="{value}*"')
            else:
                if isinstance(value, list):
                    queries.extend([f'{field}="{v}"' for v in value])
                else:
                    queries.append(f'{field}="{value}"')

        return queries

    def to_elastic(self) -> str:
        """Convert to Elastic Query DSL / KQL"""
        query_parts = []

        detection = self.rule.detection

        for key, value in detection.items():
            if key == 'condition':
                continue

            if isinstance(value, dict):
                field_queries = self._convert_selection_elastic(value)
                query_parts.append(f"({' OR '.join(field_queries)})")

        return ' AND '.join(query_parts)

    def _convert_selection_elastic(self, selection: Dict) -> List[str]:
        """Convert selection to Elastic query parts"""
        queries = []

        for field, value in selection.items():
            field_name = field.split('|')[0] if '|' in field else field

            # Map Windows fields to ECS
            field_map = {
                'Image': 'process.executable',
                'CommandLine': 'process.command_line',
                'ParentImage': 'process.parent.executable',
                'User': 'user.name',
                'ComputerName': 'host.name'
            }
            field_name = field_map.get(field_name, field_name)

            if '|' in field:
                modifier = field.split('|')[1]

                if modifier == 'contains':
                    if isinstance(value, list):
                        queries.extend([f'{field_name}:*{v}*' for v in value])
                    else:
                        queries.append(f'{field_name}:*{value}*')
            else:
                if isinstance(value, list):
                    queries.extend([f'{field_name}:"{v}"' for v in value])
                else:
                    queries.append(f'{field_name}:"{value}"')

        return queries

    def to_qradar(self) -> str:
        """Convert to QRadar AQL"""
        # QRadar-specific conversion
        pass

    def to_sentinel(self) -> str:
        """Convert to Microsoft Sentinel KQL"""
        query_parts = []

        # Start with appropriate table
        if self.rule.logsource.get('category') == 'process_creation':
            query_parts.append("SecurityEvent")
            query_parts.append("| where EventID == 4688")

        # Add field filters
        detection = self.rule.detection
        for key, value in detection.items():
            if key == 'condition':
                continue

            if isinstance(value, dict):
                for field, val in value.items():
                    field_name = field.split('|')[0]

                    # Sentinel field mapping
                    sentinel_fields = {
                        'CommandLine': 'CommandLine',
                        'Image': 'NewProcessName',
                        'User': 'SubjectUserName'
                    }
                    sentinel_field = sentinel_fields.get(field_name, field_name)

                    if '|contains' in field:
                        if isinstance(val, list):
                            conditions = ' or '.join(
                                [f'{sentinel_field} contains "{v}"' for v in val]
                            )
                            query_parts.append(f"| where {conditions}")

        return '\n'.join(query_parts)

Rule Quality Framework

# rule_quality.py
# Assess and improve detection rule quality

from dataclasses import dataclass
from typing import List, Dict, Optional
from enum import Enum

class QualityDimension(Enum):
    ACCURACY = "accuracy"           # Low false positives
    COVERAGE = "coverage"           # Catches variants
    PERFORMANCE = "performance"     # Query efficiency
    MAINTAINABILITY = "maintainability"  # Easy to update
    DOCUMENTATION = "documentation"  # Well documented

@dataclass
class RuleQualityScore:
    """Quality assessment for a detection rule"""

    rule_id: str

    # Scoring (0-100)
    accuracy_score: int
    coverage_score: int
    performance_score: int
    maintainability_score: int
    documentation_score: int

    # Evidence
    false_positive_rate: float
    true_positive_samples: int
    avg_query_time_ms: float

    # Recommendations
    improvements: List[str]

    @property
    def overall_score(self) -> float:
        weights = {
            'accuracy': 0.30,
            'coverage': 0.25,
            'performance': 0.15,
            'maintainability': 0.15,
            'documentation': 0.15
        }

        return (
            self.accuracy_score * weights['accuracy'] +
            self.coverage_score * weights['coverage'] +
            self.performance_score * weights['performance'] +
            self.maintainability_score * weights['maintainability'] +
            self.documentation_score * weights['documentation']
        )

    @property
    def grade(self) -> str:
        score = self.overall_score
        if score >= 90:
            return "A"
        elif score >= 80:
            return "B"
        elif score >= 70:
            return "C"
        elif score >= 60:
            return "D"
        return "F"

class RuleQualityAnalyzer:
    """Analyze and improve rule quality"""

    def analyze_sigma_rule(self, rule_content: str) -> RuleQualityScore:
        """Analyze a Sigma rule for quality"""
        import yaml
        rule = yaml.safe_load(rule_content)

        improvements = []

        # Documentation score
        doc_score = 100
        if not rule.get('description'):
            doc_score -= 30
            improvements.append("Add detailed description")
        if not rule.get('references'):
            doc_score -= 20
            improvements.append("Add references (ATT&CK, blog posts)")
        if not rule.get('author'):
            doc_score -= 10
            improvements.append("Add author information")
        if not rule.get('tags'):
            doc_score -= 20
            improvements.append("Add ATT&CK tags")
        if not rule.get('falsepositives'):
            doc_score -= 20
            improvements.append("Document known false positives")

        # Maintainability score
        maint_score = 100
        detection = rule.get('detection', {})

        # Check for overly specific patterns
        for key, value in detection.items():
            if isinstance(value, dict):
                for field, val in value.items():
                    if isinstance(val, str) and len(val) > 100:
                        maint_score -= 10
                        improvements.append(
                            f"Consider breaking up long pattern in {field}"
                        )

        # Check for filters
        if not any('filter' in k for k in detection.keys()):
            maint_score -= 20
            improvements.append("Add filter for known false positives")

        return RuleQualityScore(
            rule_id=rule.get('id', 'unknown'),
            accuracy_score=70,  # Requires testing to determine
            coverage_score=70,  # Requires testing
            performance_score=80,  # Requires benchmarking
            maintainability_score=maint_score,
            documentation_score=doc_score,
            false_positive_rate=0.0,  # Unknown
            true_positive_samples=0,  # Unknown
            avg_query_time_ms=0.0,  # Unknown
            improvements=improvements
        )

Mental Model

Roth approaches detection engineering by asking:

  1. Is this portable? Can it work across SIEMs?
  2. Is this documented? Metadata, references, false positives
  3. Is this testable? Can we validate it works?
  4. Is this shareable? Can the community benefit?
  5. Is this maintainable? Will it survive updates?

Signature Roth Moves

  • Sigma rules for portable detection
  • YARA rules for binary/memory patterns
  • Comprehensive rule metadata
  • Community sharing and collaboration
  • Detection-as-code in version control
  • Continuous rule quality improvement

平台分布

Codex

38.19%
按下载量换算24

Claude

28.38%
按下载量换算18

Cursor

18.72%
按下载量换算12

Gemini CLI

9.88%
按下载量换算6

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

需要联网

该 Skill 可能需要联网访问来源站点、仓库或外部 API;具体网络访问范围需要结合源码和 README 复核。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills