[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6ESC7XHCMY3ZNP56P1T4DFH":3,"skill-same:01M6ESC7XHCMY3ZNP56P1T4DFH":148},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":6,"ownerHtmlUrl":58,"ownerBlogUrl":6,"ownerDescription":59,"updatedAt":60,"install":61,"resources":74},"01M6ESC7XHCMY3ZNP56P1T4DFH","building-automated-malware-submission-pipeline",null,"Builds an automated malware submission and analysis pipeline that collects suspicious files from endpoints and email gateways, submits them to sandbox environments and multi-engine scanners, and generates verdicts with IOCs for SIEM integration. Use when SOC teams need to scale malware analysis beyond manual sandbox submissions for high-volume alert triage.","luokai0\u002Fai-agent-skills-by-luo-kai","luokai0","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F266954973?v=4","01M6E16VNT42JB8B3X3254QWJ7","luo kai","01M6E16VTFVP6S5XJF1V1MPV90",14,"Apache-2.0","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"building automated malware submission pipeline","pipeline","malware","soc","volume","files","alert","use","SOC-operations","analysis","any-run","suspicious","malware analysis","email","gateways","run","teams","siem","cybersecurity","sandbox","2026-11-10 10:12:30",false,"---\nname: building-automated-malware-submission-pipeline\ndescription: >\n  Builds an automated malware submission and analysis pipeline that collects suspicious files from\n  endpoints and email gateways, submits them to sandbox environments and multi-engine scanners,\n  and generates verdicts with IOCs for SIEM integration. Use when SOC teams need to scale malware\n  analysis beyond manual sandbox submissions for high-volume alert triage.\ndomain: cybersecurity\nsubdomain: soc-operations\ntags: [soc, malware-analysis, sandbox, automation, virustotal, cuckoo, any-run, pipeline]\nversion: \"1.0\"\nauthor: mahipal\nlicense: Apache-2.0\n---\n# Building Automated Malware Submission Pipeline\n\n## When to Use\n\nUse this skill when:\n- SOC teams face high volume of suspicious file alerts requiring sandbox analysis\n- Manual sandbox submission creates bottlenecks in alert triage workflow\n- Endpoint and email security tools quarantine files needing automated verdict determination\n- Incident response requires rapid malware family identification and IOC extraction\n\n**Do not use** for analyzing live malware samples in production environments — always use isolated sandbox infrastructure.\n\n## Prerequisites\n\n- Sandbox environment: Cuckoo Sandbox, Joe Sandbox, Any.Run, or VMRay\n- VirusTotal API key (Enterprise for submission, free for lookup)\n- MalwareBazaar API access for known malware lookup\n- File collection mechanism: EDR quarantine API, email gateway export, network capture\n- Python 3.8+ with `requests`, `vt-py`, `pefile` libraries\n- Isolated analysis network with no production connectivity\n\n## Workflow\n\n### Step 1: Build File Collection Pipeline\n\nCollect suspicious files from multiple sources:\n\n```python\nimport requests\nimport hashlib\nimport os\nfrom pathlib import Path\nfrom datetime import datetime\n\nclass MalwareCollector:\n    def __init__(self, quarantine_dir=\"\u002Fopt\u002Fmalware_quarantine\"):\n        self.quarantine_dir = Path(quarantine_dir)\n        self.quarantine_dir.mkdir(exist_ok=True)\n\n    def collect_from_edr(self, edr_api_url, api_token):\n        \"\"\"Pull quarantined files from CrowdStrike Falcon\"\"\"\n        headers = {\"Authorization\": f\"Bearer {api_token}\"}\n\n        # Get recent quarantine events\n        response = requests.get(\n            f\"{edr_api_url}\u002Fquarantine\u002Fqueries\u002Fquarantined-files\u002Fv1\",\n            headers=headers,\n            params={\"filter\": \"state:'quarantined'\", \"limit\": 50}\n        )\n        file_ids = response.json()[\"resources\"]\n\n        for file_id in file_ids:\n            # Download quarantined file\n            dl_response = requests.get(\n                f\"{edr_api_url}\u002Fquarantine\u002Fentities\u002Fquarantined-files\u002Fv1\",\n                headers=headers,\n                params={\"ids\": file_id}\n            )\n            file_data = dl_response.content\n            sha256 = hashlib.sha256(file_data).hexdigest()\n\n            filepath = self.quarantine_dir \u002F f\"{sha256}.sample\"\n            filepath.write_bytes(file_data)\n            yield {\"sha256\": sha256, \"path\": str(filepath), \"source\": \"edr\"}\n\n    def collect_from_email_gateway(self, smtp_quarantine_path):\n        \"\"\"Pull attachments from email gateway quarantine\"\"\"\n        import email\n        from email import policy\n\n        for eml_file in Path(smtp_quarantine_path).glob(\"*.eml\"):\n            msg = email.message_from_binary_file(\n                eml_file.open(\"rb\"), policy=policy.default\n            )\n            for attachment in msg.iter_attachments():\n                content = attachment.get_content()\n                if isinstance(content, str):\n                    content = content.encode()\n                sha256 = hashlib.sha256(content).hexdigest()\n                filename = attachment.get_filename() or \"unknown\"\n\n                filepath = self.quarantine_dir \u002F f\"{sha256}.sample\"\n                filepath.write_bytes(content)\n                yield {\n                    \"sha256\": sha256,\n                    \"path\": str(filepath),\n                    \"source\": \"email\",\n                    \"original_filename\": filename,\n                    \"sender\": msg[\"From\"],\n                    \"subject\": msg[\"Subject\"]\n                }\n\n    def compute_hashes(self, filepath):\n        \"\"\"Calculate MD5, SHA1, SHA256 for a file\"\"\"\n        with open(filepath, \"rb\") as f:\n            content = f.read()\n        return {\n            \"md5\": hashlib.md5(content).hexdigest(),\n            \"sha1\": hashlib.sha1(content).hexdigest(),\n            \"sha256\": hashlib.sha256(content).hexdigest(),\n            \"size\": len(content)\n        }\n```\n\n### Step 2: Pre-Screen with Hash Lookups\n\nCheck if the file is already known before sandbox submission:\n\n```python\nimport vt\n\nclass MalwarePreScreener:\n    def __init__(self, vt_api_key, mb_api_url=\"https:\u002F\u002Fmb-api.abuse.ch\u002Fapi\u002Fv1\u002F\"):\n        self.vt_client = vt.Client(vt_api_key)\n        self.mb_api_url = mb_api_url\n\n    def check_virustotal(self, sha256):\n        \"\"\"Lookup hash in VirusTotal\"\"\"\n        try:\n            file_obj = self.vt_client.get_object(f\"\u002Ffiles\u002F{sha256}\")\n            stats = file_obj.last_analysis_stats\n            return {\n                \"found\": True,\n                \"malicious\": stats.get(\"malicious\", 0),\n                \"suspicious\": stats.get(\"suspicious\", 0),\n                \"undetected\": stats.get(\"undetected\", 0),\n                \"total\": sum(stats.values()),\n                \"threat_label\": getattr(file_obj, \"popular_threat_classification\", {}).get(\n                    \"suggested_threat_label\", \"Unknown\"\n                ),\n                \"type\": getattr(file_obj, \"type_description\", \"Unknown\")\n            }\n        except vt.APIError:\n            return {\"found\": False}\n\n    def check_malwarebazaar(self, sha256):\n        \"\"\"Lookup hash in MalwareBazaar\"\"\"\n        response = requests.post(\n            self.mb_api_url,\n            data={\"query\": \"get_info\", \"hash\": sha256}\n        )\n        data = response.json()\n        if data[\"query_status\"] == \"ok\":\n            entry = data[\"data\"][0]\n            return {\n                \"found\": True,\n                \"signature\": entry.get(\"signature\", \"Unknown\"),\n                \"tags\": entry.get(\"tags\", []),\n                \"file_type\": entry.get(\"file_type\", \"Unknown\"),\n                \"first_seen\": entry.get(\"first_seen\", \"Unknown\")\n            }\n        return {\"found\": False}\n\n    def pre_screen(self, sha256):\n        \"\"\"Run all pre-screening checks\"\"\"\n        vt_result = self.check_virustotal(sha256)\n        mb_result = self.check_malwarebazaar(sha256)\n\n        verdict = \"UNKNOWN\"\n        if vt_result[\"found\"] and vt_result.get(\"malicious\", 0) > 10:\n            verdict = \"KNOWN_MALICIOUS\"\n        elif vt_result[\"found\"] and vt_result.get(\"malicious\", 0) == 0:\n            verdict = \"LIKELY_CLEAN\"\n\n        return {\n            \"sha256\": sha256,\n            \"virustotal\": vt_result,\n            \"malwarebazaar\": mb_result,\n            \"pre_screen_verdict\": verdict,\n            \"needs_sandbox\": verdict == \"UNKNOWN\"\n        }\n\n    def close(self):\n        self.vt_client.close()\n```\n\n### Step 3: Submit to Sandbox for Dynamic Analysis\n\n**Cuckoo Sandbox Submission:**\n\n```python\nclass SandboxSubmitter:\n    def __init__(self, cuckoo_url=\"http:\u002F\u002Fcuckoo.internal:8090\"):\n        self.cuckoo_url = cuckoo_url\n\n    def submit_to_cuckoo(self, filepath, timeout=300):\n        \"\"\"Submit file to Cuckoo Sandbox\"\"\"\n        with open(filepath, \"rb\") as f:\n            response = requests.post(\n                f\"{self.cuckoo_url}\u002Ftasks\u002Fcreate\u002Ffile\",\n                files={\"file\": f},\n                data={\n                    \"timeout\": timeout,\n                    \"options\": \"procmemdump=yes,route=none\",\n                    \"priority\": 2,\n                    \"machine\": \"win10_x64\"\n                }\n            )\n        task_id = response.json()[\"task_id\"]\n        return task_id\n\n    def wait_for_analysis(self, task_id, poll_interval=30, max_wait=600):\n        \"\"\"Wait for sandbox analysis to complete\"\"\"\n        import time\n        elapsed = 0\n        while elapsed \u003C max_wait:\n            response = requests.get(f\"{self.cuckoo_url}\u002Ftasks\u002Fview\u002F{task_id}\")\n            status = response.json()[\"task\"][\"status\"]\n            if status == \"reported\":\n                return self.get_report(task_id)\n            elif status == \"failed_analysis\":\n                return {\"error\": \"Analysis failed\"}\n            time.sleep(poll_interval)\n            elapsed += poll_interval\n        return {\"error\": \"Analysis timed out\"}\n\n    def get_report(self, task_id):\n        \"\"\"Retrieve analysis report\"\"\"\n        response = requests.get(f\"{self.cuckoo_url}\u002Ftasks\u002Freport\u002F{task_id}\")\n        report = response.json()\n\n        # Extract key indicators\n        return {\n            \"task_id\": task_id,\n            \"score\": report.get(\"info\", {}).get(\"score\", 0),\n            \"signatures\": [\n                {\"name\": s[\"name\"], \"severity\": s[\"severity\"], \"description\": s[\"description\"]}\n                for s in report.get(\"signatures\", [])\n            ],\n            \"network\": {\n                \"dns\": [d[\"request\"] for d in report.get(\"network\", {}).get(\"dns\", [])],\n                \"http\": [\n                    {\"url\": h[\"uri\"], \"method\": h[\"method\"]}\n                    for h in report.get(\"network\", {}).get(\"http\", [])\n                ],\n                \"hosts\": report.get(\"network\", {}).get(\"hosts\", [])\n            },\n            \"dropped_files\": [\n                {\"name\": f[\"name\"], \"sha256\": f[\"sha256\"], \"size\": f[\"size\"]}\n                for f in report.get(\"dropped\", [])\n            ],\n            \"processes\": [\n                {\"name\": p[\"process_name\"], \"pid\": p[\"pid\"], \"command_line\": p.get(\"command_line\", \"\")}\n                for p in report.get(\"behavior\", {}).get(\"processes\", [])\n            ],\n            \"registry_keys\": [\n                k for k in report.get(\"behavior\", {}).get(\"summary\", {}).get(\"regkey_written\", [])\n            ]\n        }\n\n    def submit_to_joesandbox(self, filepath, joe_api_key, joe_url=\"https:\u002F\u002Fjbxcloud.joesecurity.org\u002Fapi\"):\n        \"\"\"Submit to Joe Sandbox Cloud\"\"\"\n        with open(filepath, \"rb\") as f:\n            response = requests.post(\n                f\"{joe_url}\u002Fv2\u002Fsubmission\u002Fnew\",\n                headers={\"Authorization\": f\"Bearer {joe_api_key}\"},\n                files={\"sample\": f},\n                data={\n                    \"systems\": \"w10_64\",\n                    \"internet-access\": False,\n                    \"report-cache\": True\n                }\n            )\n        return response.json()[\"data\"][\"webid\"]\n```\n\n### Step 4: Extract IOCs and Generate Verdict\n\n```python\nclass VerdictGenerator:\n    def __init__(self):\n        self.malicious_threshold = 7  # Cuckoo score threshold\n\n    def generate_verdict(self, pre_screen, sandbox_report):\n        \"\"\"Combine pre-screening and sandbox results for final verdict\"\"\"\n        iocs = {\n            \"ips\": [],\n            \"domains\": [],\n            \"urls\": [],\n            \"hashes\": [],\n            \"registry_keys\": [],\n            \"files_dropped\": []\n        }\n\n        # Extract IOCs from sandbox report\n        if sandbox_report:\n            iocs[\"domains\"] = sandbox_report.get(\"network\", {}).get(\"dns\", [])\n            iocs[\"ips\"] = sandbox_report.get(\"network\", {}).get(\"hosts\", [])\n            iocs[\"urls\"] = [\n                h[\"url\"] for h in sandbox_report.get(\"network\", {}).get(\"http\", [])\n            ]\n            iocs[\"hashes\"] = [\n                f[\"sha256\"] for f in sandbox_report.get(\"dropped_files\", [])\n            ]\n            iocs[\"registry_keys\"] = sandbox_report.get(\"registry_keys\", [])[:10]\n            iocs[\"files_dropped\"] = sandbox_report.get(\"dropped_files\", [])\n\n        # Determine verdict\n        vt_malicious = pre_screen.get(\"virustotal\", {}).get(\"malicious\", 0)\n        sandbox_score = sandbox_report.get(\"score\", 0) if sandbox_report else 0\n        sig_count = len(sandbox_report.get(\"signatures\", [])) if sandbox_report else 0\n\n        combined_score = (vt_malicious * 2) + (sandbox_score * 10) + (sig_count * 5)\n\n        if combined_score >= 100:\n            verdict = \"MALICIOUS\"\n            confidence = \"HIGH\"\n        elif combined_score >= 50:\n            verdict = \"SUSPICIOUS\"\n            confidence = \"MEDIUM\"\n        elif combined_score >= 20:\n            verdict = \"POTENTIALLY_UNWANTED\"\n            confidence = \"LOW\"\n        else:\n            verdict = \"CLEAN\"\n            confidence = \"HIGH\"\n\n        return {\n            \"verdict\": verdict,\n            \"confidence\": confidence,\n            \"combined_score\": combined_score,\n            \"iocs\": iocs,\n            \"vt_detections\": vt_malicious,\n            \"sandbox_score\": sandbox_score,\n            \"signatures\": sandbox_report.get(\"signatures\", []) if sandbox_report else []\n        }\n```\n\n### Step 5: Push Results to SIEM\n\n```python\ndef push_to_splunk(verdict_result, splunk_url, splunk_token):\n    \"\"\"Send malware analysis verdict to Splunk HEC\"\"\"\n    import json\n\n    event = {\n        \"sourcetype\": \"malware_analysis\",\n        \"source\": \"malware_pipeline\",\n        \"event\": {\n            \"sha256\": verdict_result[\"sha256\"],\n            \"verdict\": verdict_result[\"verdict\"],\n            \"confidence\": verdict_result[\"confidence\"],\n            \"score\": verdict_result[\"combined_score\"],\n            \"vt_detections\": verdict_result[\"vt_detections\"],\n            \"sandbox_score\": verdict_result[\"sandbox_score\"],\n            \"malware_family\": verdict_result.get(\"threat_label\", \"Unknown\"),\n            \"iocs\": verdict_result[\"iocs\"],\n            \"signatures\": [s[\"name\"] for s in verdict_result[\"signatures\"]]\n        }\n    }\n\n    response = requests.post(\n        f\"{splunk_url}\u002Fservices\u002Fcollector\u002Fevent\",\n        headers={\n            \"Authorization\": f\"Splunk {splunk_token}\",\n            \"Content-Type\": \"application\u002Fjson\"\n        },\n        json=event,\n        verify=not os.environ.get(\"SKIP_TLS_VERIFY\", \"\").lower() == \"true\",  # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments\n    )\n    return response.status_code == 200\n\ndef push_iocs_to_blocklist(iocs, firewall_api):\n    \"\"\"Push extracted IOCs to blocking infrastructure\"\"\"\n    for ip in iocs.get(\"ips\", []):\n        requests.post(\n            f\"{firewall_api}\u002Fblock\",\n            json={\"type\": \"ip\", \"value\": ip, \"action\": \"block\", \"source\": \"malware_pipeline\"}\n        )\n    for domain in iocs.get(\"domains\", []):\n        requests.post(\n            f\"{firewall_api}\u002Fblock\",\n            json={\"type\": \"domain\", \"value\": domain, \"action\": \"sinkhole\", \"source\": \"malware_pipeline\"}\n        )\n```\n\n### Step 6: Orchestrate the Full Pipeline\n\n```python\ndef run_malware_pipeline(sample_path, config):\n    \"\"\"Execute full malware analysis pipeline\"\"\"\n    collector = MalwareCollector()\n    screener = MalwarePreScreener(config[\"vt_key\"])\n    submitter = SandboxSubmitter(config[\"cuckoo_url\"])\n    generator = VerdictGenerator()\n\n    # Step 1: Hash and pre-screen\n    hashes = collector.compute_hashes(sample_path)\n    pre_screen = screener.pre_screen(hashes[\"sha256\"])\n\n    # Step 2: Submit to sandbox if unknown\n    sandbox_report = None\n    if pre_screen[\"needs_sandbox\"]:\n        task_id = submitter.submit_to_cuckoo(sample_path)\n        sandbox_report = submitter.wait_for_analysis(task_id)\n\n    # Step 3: Generate verdict\n    verdict = generator.generate_verdict(pre_screen, sandbox_report)\n    verdict[\"sha256\"] = hashes[\"sha256\"]\n    verdict[\"threat_label\"] = pre_screen.get(\"virustotal\", {}).get(\"threat_label\", \"Unknown\")\n\n    # Step 4: Push to SIEM\n    push_to_splunk(verdict, config[\"splunk_url\"], config[\"splunk_token\"])\n\n    # Step 5: Block if malicious\n    if verdict[\"verdict\"] == \"MALICIOUS\":\n        push_iocs_to_blocklist(verdict[\"iocs\"], config[\"firewall_api\"])\n\n    screener.close()\n    return verdict\n```\n\n## Key Concepts\n\n| Term | Definition |\n|------|-----------|\n| **Dynamic Analysis** | Executing malware in a sandbox to observe runtime behavior (process creation, network, file system changes) |\n| **Static Analysis** | Examining malware without execution (hash lookup, string analysis, PE header inspection) |\n| **Sandbox Evasion** | Techniques malware uses to detect sandbox environments and alter behavior to avoid analysis |\n| **IOC Extraction** | Automated process of identifying network indicators, file artifacts, and registry changes from sandbox reports |\n| **Multi-AV Scanning** | Submitting samples to multiple antivirus engines (VirusTotal) for consensus-based detection |\n| **Verdict** | Final classification of a sample: Malicious, Suspicious, Potentially Unwanted, or Clean |\n\n## Tools & Systems\n\n- **Cuckoo Sandbox**: Open-source automated malware analysis platform with behavioral analysis and network capture\n- **Joe Sandbox**: Commercial sandbox with deep behavioral analysis, YARA matching, and MITRE ATT&CK mapping\n- **Any.Run**: Interactive sandbox service allowing real-time manipulation during analysis for debugging evasive malware\n- **VirusTotal**: Multi-engine scanning service providing 70+ AV results and behavioral analysis reports\n- **CAPE Sandbox**: Community-maintained Cuckoo fork with enhanced payload extraction and configuration dumping\n\n## Common Scenarios\n\n- **Email Attachment Triage**: Auto-submit quarantined email attachments, generate verdict in \u003C5 minutes\n- **EDR Quarantine Processing**: Batch-process files quarantined by endpoint security for detailed analysis\n- **Incident Investigation**: Submit suspicious binaries found during IR for malware family identification and IOC extraction\n- **Threat Intel Enrichment**: Analyze samples from threat feeds to extract C2 infrastructure and update blocking\n- **Zero-Day Detection**: Sandbox catches novel malware missed by signature-based AV through behavioral analysis\n\n## Output Format\n\n```\nMALWARE ANALYSIS REPORT — Pipeline Submission\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nSample:       invoice_march.docx\nSHA256:       a1b2c3d4e5f6a7b8...\nFile Type:    Microsoft Word Document (macro-enabled)\n\nPre-Screening:\n  VirusTotal:    34\u002F72 malicious (Emotet.Downloader)\n  MalwareBazaar: Tags: emotet, macro, downloader\n\nSandbox Analysis (Cuckoo):\n  Score:         9.2\u002F10 (MALICIOUS)\n  Signatures:\n    - Macro executes PowerShell download cradle (severity: 8)\n    - Process injection into explorer.exe (severity: 9)\n    - Connects to known Emotet C2 server (severity: 9)\n\nExtracted IOCs:\n  C2 IPs:       185.234.218[.]50:8080, 45.77.123[.]45:443\n  Domains:       update-service[.]evil[.]com\n  Dropped Files: payload.dll (SHA256: b2c3d4e5...)\n  Registry:      HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Update\n\nVERDICT: MALICIOUS (Emotet Downloader) — Confidence: HIGH\nACTIONS:\n  [DONE] IOCs pushed to Splunk threat intel\n  [DONE] C2 IPs blocked on firewall\n  [DONE] Domain sinkholed on DNS\n  [DONE] Hash blocked on endpoint\n```\n","# Building Automated Malware Submission Pipeline\n\n## When to Use\n\nUse this skill when:\n- SOC teams face high volume of suspicious file alerts requiring sandbox analysis\n- Manual sandbox submission creates bottlenecks in alert triage workflow\n- Endpoint and email security tools quarantine files needing automated verdict determination\n- Incident response requires rapid malware family identification and IOC extraction\n\n**Do not use** for analyzing live malware samples in production environments — always use isolated sandbox infrastructure.\n\n## Prerequisites\n\n- Sandbox environment: Cuckoo Sandbox, Joe Sandbox, Any.Run, or VMRay\n- VirusTotal API key (Enterprise for submission, free for lookup)\n- MalwareBazaar API access for known malware lookup\n- File collection mechanism: EDR quarantine API, email gateway export, network capture\n- Python 3.8+ with `requests`, `vt-py`, `pefile` libraries\n- Isolated analysis network with no production connectivity\n\n## Workflow\n\n### Step 1: Build File Collection Pipeline\n\nCollect suspicious files from multiple sources:\n\n```python\nimport requests\nimport hashlib\nimport os\nfrom pathlib import Path\nfrom datetime import datetime\n\nclass MalwareCollector:\n    def __init__(self, quarantine_dir=\"\u002Fopt\u002Fmalware_quarantine\"):\n        self.quarantine_dir = Path(quarantine_dir)\n        self.quarantine_dir.mkdir(exist_ok=True)\n\n    def collect_from_edr(self, edr_api_url, api_token):\n        \"\"\"Pull quarantined files from CrowdStrike Falcon\"\"\"\n        headers = {\"Authorization\": f\"Bearer {api_token}\"}\n\n        # Get recent quarantine events\n        response = requests.get(\n            f\"{edr_api_url}\u002Fquarantine\u002Fqueries\u002Fquarantined-files\u002Fv1\",\n            headers=headers,\n            params={\"filter\": \"state:'quarantined'\", \"limit\": 50}\n        )\n        file_ids = response.json()[\"resources\"]\n\n        for file_id in file_ids:\n            # Download quarantined file\n            dl_response = requests.get(\n                f\"{edr_api_url}\u002Fquarantine\u002Fentities\u002Fquarantined-files\u002Fv1\",\n                headers=headers,\n                params={\"ids\": file_id}\n            )\n            file_data = dl_response.content\n            sha256 = hashlib.sha256(file_data).hexdigest()\n\n            filepath = self.quarantine_dir \u002F f\"{sha256}.sample\"\n            filepath.write_bytes(file_data)\n            yield {\"sha256\": sha256, \"path\": str(filepath), \"source\": \"edr\"}\n\n    def collect_from_email_gateway(self, smtp_quarantine_path):\n        \"\"\"Pull attachments from email gateway quarantine\"\"\"\n        import email\n        from email import policy\n\n        for eml_file in Path(smtp_quarantine_path).glob(\"*.eml\"):\n            msg = email.message_from_binary_file(\n                eml_file.open(\"rb\"), policy=policy.default\n            )\n            for attachment in msg.iter_attachments():\n                content = attachment.get_content()\n                if isinstance(content, str):\n                    content = content.encode()\n                sha256 = hashlib.sha256(content).hexdigest()\n                filename = attachment.get_filename() or \"unknown\"\n\n                filepath = self.quarantine_dir \u002F f\"{sha256}.sample\"\n                filepath.write_bytes(content)\n                yield {\n                    \"sha256\": sha256,\n                    \"path\": str(filepath),\n                    \"source\": \"email\",\n                    \"original_filename\": filename,\n                    \"sender\": msg[\"From\"],\n                    \"subject\": msg[\"Subject\"]\n                }\n\n    def compute_hashes(self, filepath):\n        \"\"\"Calculate MD5, SHA1, SHA256 for a file\"\"\"\n        with open(filepath, \"rb\") as f:\n            content = f.read()\n        return {\n            \"md5\": hashlib.md5(content).hexdigest(),\n            \"sha1\": hashlib.sha1(content).hexdigest(),\n            \"sha256\": hashlib.sha256(content).hexdigest(),\n            \"size\": len(content)\n        }\n```\n\n### Step 2: Pre-Screen with Hash Lookups\n\nCheck if the file is already known before sandbox submission:\n\n```python\nimport vt\n\nclass MalwarePreScreener:\n    def __init__(self, vt_api_key, mb_api_url=\"https:\u002F\u002Fmb-api.abuse.ch\u002Fapi\u002Fv1\u002F\"):\n        self.vt_client = vt.Client(vt_api_key)\n        self.mb_api_url = mb_api_url\n\n    def check_virustotal(self, sha256):\n        \"\"\"Lookup hash in VirusTotal\"\"\"\n        try:\n            file_obj = self.vt_client.get_object(f\"\u002Ffiles\u002F{sha256}\")\n            stats = file_obj.last_analysis_stats\n            return {\n                \"found\": True,\n                \"malicious\": stats.get(\"malicious\", 0),\n                \"suspicious\": stats.get(\"suspicious\", 0),\n                \"undetected\": stats.get(\"undetected\", 0),\n                \"total\": sum(stats.values()),\n                \"threat_label\": getattr(file_obj, \"popular_threat_classification\", {}).get(\n                    \"suggested_threat_label\", \"Unknown\"\n                ),\n                \"type\": getattr(file_obj, \"type_description\", \"Unknown\")\n            }\n        except vt.APIError:\n            return {\"found\": False}\n\n    def check_malwarebazaar(self, sha256):\n        \"\"\"Lookup hash in MalwareBazaar\"\"\"\n        response = requests.post(\n            self.mb_api_url,\n            data={\"query\": \"get_info\", \"hash\": sha256}\n        )\n        data = response.json()\n        if data[\"query_status\"] == \"ok\":\n            entry = data[\"data\"][0]\n            return {\n                \"found\": True,\n                \"signature\": entry.get(\"signature\", \"Unknown\"),\n                \"tags\": entry.get(\"tags\", []),\n                \"file_type\": entry.get(\"file_type\", \"Unknown\"),\n                \"first_seen\": entry.get(\"first_seen\", \"Unknown\")\n            }\n        return {\"found\": False}\n\n    def pre_screen(self, sha256):\n        \"\"\"Run all pre-screening checks\"\"\"\n        vt_result = self.check_virustotal(sha256)\n        mb_result = self.check_malwarebazaar(sha256)\n\n        verdict = \"UNKNOWN\"\n        if vt_result[\"found\"] and vt_result.get(\"malicious\", 0) > 10:\n            verdict = \"KNOWN_MALICIOUS\"\n        elif vt_result[\"found\"] and vt_result.get(\"malicious\", 0) == 0:\n            verdict = \"LIKELY_CLEAN\"\n\n        return {\n            \"sha256\": sha256,\n            \"virustotal\": vt_result,\n            \"malwarebazaar\": mb_result,\n            \"pre_screen_verdict\": verdict,\n            \"needs_sandbox\": verdict == \"UNKNOWN\"\n        }\n\n    def close(self):\n        self.vt_client.close()\n```\n\n### Step 3: Submit to Sandbox for Dynamic Analysis\n\n**Cuckoo Sandbox Submission:**\n\n```python\nclass SandboxSubmitter:\n    def __init__(self, cuckoo_url=\"http:\u002F\u002Fcuckoo.internal:8090\"):\n        self.cuckoo_url = cuckoo_url\n\n    def submit_to_cuckoo(self, filepath, timeout=300):\n        \"\"\"Submit file to Cuckoo Sandbox\"\"\"\n        with open(filepath, \"rb\") as f:\n            response = requests.post(\n                f\"{self.cuckoo_url}\u002Ftasks\u002Fcreate\u002Ffile\",\n                files={\"file\": f},\n                data={\n                    \"timeout\": timeout,\n                    \"options\": \"procmemdump=yes,route=none\",\n                    \"priority\": 2,\n                    \"machine\": \"win10_x64\"\n                }\n            )\n        task_id = response.json()[\"task_id\"]\n        return task_id\n\n    def wait_for_analysis(self, task_id, poll_interval=30, max_wait=600):\n        \"\"\"Wait for sandbox analysis to complete\"\"\"\n        import time\n        elapsed = 0\n        while elapsed \u003C max_wait:\n            response = requests.get(f\"{self.cuckoo_url}\u002Ftasks\u002Fview\u002F{task_id}\")\n            status = response.json()[\"task\"][\"status\"]\n            if status == \"reported\":\n                return self.get_report(task_id)\n            elif status == \"failed_analysis\":\n                return {\"error\": \"Analysis failed\"}\n            time.sleep(poll_interval)\n            elapsed += poll_interval\n        return {\"error\": \"Analysis timed out\"}\n\n    def get_report(self, task_id):\n        \"\"\"Retrieve analysis report\"\"\"\n        response = requests.get(f\"{self.cuckoo_url}\u002Ftasks\u002Freport\u002F{task_id}\")\n        report = response.json()\n\n        # Extract key indicators\n        return {\n            \"task_id\": task_id,\n            \"score\": report.get(\"info\", {}).get(\"score\", 0),\n            \"signatures\": [\n                {\"name\": s[\"name\"], \"severity\": s[\"severity\"], \"description\": s[\"description\"]}\n                for s in report.get(\"signatures\", [])\n            ],\n            \"network\": {\n                \"dns\": [d[\"request\"] for d in report.get(\"network\", {}).get(\"dns\", [])],\n                \"http\": [\n                    {\"url\": h[\"uri\"], \"method\": h[\"method\"]}\n                    for h in report.get(\"network\", {}).get(\"http\", [])\n                ],\n                \"hosts\": report.get(\"network\", {}).get(\"hosts\", [])\n            },\n            \"dropped_files\": [\n                {\"name\": f[\"name\"], \"sha256\": f[\"sha256\"], \"size\": f[\"size\"]}\n                for f in report.get(\"dropped\", [])\n            ],\n            \"processes\": [\n                {\"name\": p[\"process_name\"], \"pid\": p[\"pid\"], \"command_line\": p.get(\"command_line\", \"\")}\n                for p in report.get(\"behavior\", {}).get(\"processes\", [])\n            ],\n            \"registry_keys\": [\n                k for k in report.get(\"behavior\", {}).get(\"summary\", {}).get(\"regkey_written\", [])\n            ]\n        }\n\n    def submit_to_joesandbox(self, filepath, joe_api_key, joe_url=\"https:\u002F\u002Fjbxcloud.joesecurity.org\u002Fapi\"):\n        \"\"\"Submit to Joe Sandbox Cloud\"\"\"\n        with open(filepath, \"rb\") as f:\n            response = requests.post(\n                f\"{joe_url}\u002Fv2\u002Fsubmission\u002Fnew\",\n                headers={\"Authorization\": f\"Bearer {joe_api_key}\"},\n                files={\"sample\": f},\n                data={\n                    \"systems\": \"w10_64\",\n                    \"internet-access\": False,\n                    \"report-cache\": True\n                }\n            )\n        return response.json()[\"data\"][\"webid\"]\n```\n\n### Step 4: Extract IOCs and Generate Verdict\n\n```python\nclass VerdictGenerator:\n    def __init__(self):\n        self.malicious_threshold = 7  # Cuckoo score threshold\n\n    def generate_verdict(self, pre_screen, sandbox_report):\n        \"\"\"Combine pre-screening and sandbox results for final verdict\"\"\"\n        iocs = {\n            \"ips\": [],\n            \"domains\": [],\n            \"urls\": [],\n            \"hashes\": [],\n            \"registry_keys\": [],\n            \"files_dropped\": []\n        }\n\n        # Extract IOCs from sandbox report\n        if sandbox_report:\n            iocs[\"domains\"] = sandbox_report.get(\"network\", {}).get(\"dns\", [])\n            iocs[\"ips\"] = sandbox_report.get(\"network\", {}).get(\"hosts\", [])\n            iocs[\"urls\"] = [\n                h[\"url\"] for h in sandbox_report.get(\"network\", {}).get(\"http\", [])\n            ]\n            iocs[\"hashes\"] = [\n                f[\"sha256\"] for f in sandbox_report.get(\"dropped_files\", [])\n            ]\n            iocs[\"registry_keys\"] = sandbox_report.get(\"registry_keys\", [])[:10]\n            iocs[\"files_dropped\"] = sandbox_report.get(\"dropped_files\", [])\n\n        # Determine verdict\n        vt_malicious = pre_screen.get(\"virustotal\", {}).get(\"malicious\", 0)\n        sandbox_score = sandbox_report.get(\"score\", 0) if sandbox_report else 0\n        sig_count = len(sandbox_report.get(\"signatures\", [])) if sandbox_report else 0\n\n        combined_score = (vt_malicious * 2) + (sandbox_score * 10) + (sig_count * 5)\n\n        if combined_score >= 100:\n            verdict = \"MALICIOUS\"\n            confidence = \"HIGH\"\n        elif combined_score >= 50:\n            verdict = \"SUSPICIOUS\"\n            confidence = \"MEDIUM\"\n        elif combined_score >= 20:\n            verdict = \"POTENTIALLY_UNWANTED\"\n            confidence = \"LOW\"\n        else:\n            verdict = \"CLEAN\"\n            confidence = \"HIGH\"\n\n        return {\n            \"verdict\": verdict,\n            \"confidence\": confidence,\n            \"combined_score\": combined_score,\n            \"iocs\": iocs,\n            \"vt_detections\": vt_malicious,\n            \"sandbox_score\": sandbox_score,\n            \"signatures\": sandbox_report.get(\"signatures\", []) if sandbox_report else []\n        }\n```\n\n### Step 5: Push Results to SIEM\n\n```python\ndef push_to_splunk(verdict_result, splunk_url, splunk_token):\n    \"\"\"Send malware analysis verdict to Splunk HEC\"\"\"\n    import json\n\n    event = {\n        \"sourcetype\": \"malware_analysis\",\n        \"source\": \"malware_pipeline\",\n        \"event\": {\n            \"sha256\": verdict_result[\"sha256\"],\n            \"verdict\": verdict_result[\"verdict\"],\n            \"confidence\": verdict_result[\"confidence\"],\n            \"score\": verdict_result[\"combined_score\"],\n            \"vt_detections\": verdict_result[\"vt_detections\"],\n            \"sandbox_score\": verdict_result[\"sandbox_score\"],\n            \"malware_family\": verdict_result.get(\"threat_label\", \"Unknown\"),\n            \"iocs\": verdict_result[\"iocs\"],\n            \"signatures\": [s[\"name\"] for s in verdict_result[\"signatures\"]]\n        }\n    }\n\n    response = requests.post(\n        f\"{splunk_url}\u002Fservices\u002Fcollector\u002Fevent\",\n        headers={\n            \"Authorization\": f\"Splunk {splunk_token}\",\n            \"Content-Type\": \"application\u002Fjson\"\n        },\n        json=event,\n        verify=not os.environ.get(\"SKIP_TLS_VERIFY\", \"\").lower() == \"true\",  # Set SKIP_TLS_VERIFY=true for self-signed certs in lab environments\n    )\n    return response.status_code == 200\n\ndef push_iocs_to_blocklist(iocs, firewall_api):\n    \"\"\"Push extracted IOCs to blocking infrastructure\"\"\"\n    for ip in iocs.get(\"ips\", []):\n        requests.post(\n            f\"{firewall_api}\u002Fblock\",\n            json={\"type\": \"ip\", \"value\": ip, \"action\": \"block\", \"source\": \"malware_pipeline\"}\n        )\n    for domain in iocs.get(\"domains\", []):\n        requests.post(\n            f\"{firewall_api}\u002Fblock\",\n            json={\"type\": \"domain\", \"value\": domain, \"action\": \"sinkhole\", \"source\": \"malware_pipeline\"}\n        )\n```\n\n### Step 6: Orchestrate the Full Pipeline\n\n```python\ndef run_malware_pipeline(sample_path, config):\n    \"\"\"Execute full malware analysis pipeline\"\"\"\n    collector = MalwareCollector()\n    screener = MalwarePreScreener(config[\"vt_key\"])\n    submitter = SandboxSubmitter(config[\"cuckoo_url\"])\n    generator = VerdictGenerator()\n\n    # Step 1: Hash and pre-screen\n    hashes = collector.compute_hashes(sample_path)\n    pre_screen = screener.pre_screen(hashes[\"sha256\"])\n\n    # Step 2: Submit to sandbox if unknown\n    sandbox_report = None\n    if pre_screen[\"needs_sandbox\"]:\n        task_id = submitter.submit_to_cuckoo(sample_path)\n        sandbox_report = submitter.wait_for_analysis(task_id)\n\n    # Step 3: Generate verdict\n    verdict = generator.generate_verdict(pre_screen, sandbox_report)\n    verdict[\"sha256\"] = hashes[\"sha256\"]\n    verdict[\"threat_label\"] = pre_screen.get(\"virustotal\", {}).get(\"threat_label\", \"Unknown\")\n\n    # Step 4: Push to SIEM\n    push_to_splunk(verdict, config[\"splunk_url\"], config[\"splunk_token\"])\n\n    # Step 5: Block if malicious\n    if verdict[\"verdict\"] == \"MALICIOUS\":\n        push_iocs_to_blocklist(verdict[\"iocs\"], config[\"firewall_api\"])\n\n    screener.close()\n    return verdict\n```\n\n## Key Concepts\n\n| Term | Definition |\n|------|-----------|\n| **Dynamic Analysis** | Executing malware in a sandbox to observe runtime behavior (process creation, network, file system changes) |\n| **Static Analysis** | Examining malware without execution (hash lookup, string analysis, PE header inspection) |\n| **Sandbox Evasion** | Techniques malware uses to detect sandbox environments and alter behavior to avoid analysis |\n| **IOC Extraction** | Automated process of identifying network indicators, file artifacts, and registry changes from sandbox reports |\n| **Multi-AV Scanning** | Submitting samples to multiple antivirus engines (VirusTotal) for consensus-based detection |\n| **Verdict** | Final classification of a sample: Malicious, Suspicious, Potentially Unwanted, or Clean |\n\n## Tools & Systems\n\n- **Cuckoo Sandbox**: Open-source automated malware analysis platform with behavioral analysis and network capture\n- **Joe Sandbox**: Commercial sandbox with deep behavioral analysis, YARA matching, and MITRE ATT&CK mapping\n- **Any.Run**: Interactive sandbox service allowing real-time manipulation during analysis for debugging evasive malware\n- **VirusTotal**: Multi-engine scanning service providing 70+ AV results and behavioral analysis reports\n- **CAPE Sandbox**: Community-maintained Cuckoo fork with enhanced payload extraction and configuration dumping\n\n## Common Scenarios\n\n- **Email Attachment Triage**: Auto-submit quarantined email attachments, generate verdict in \u003C5 minutes\n- **EDR Quarantine Processing**: Batch-process files quarantined by endpoint security for detailed analysis\n- **Incident Investigation**: Submit suspicious binaries found during IR for malware family identification and IOC extraction\n- **Threat Intel Enrichment**: Analyze samples from threat feeds to extract C2 infrastructure and update blocking\n- **Zero-Day Detection**: Sandbox catches novel malware missed by signature-based AV through behavioral analysis\n\n## Output Format\n\n```\nMALWARE ANALYSIS REPORT — Pipeline Submission\n━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\nSample:       invoice_march.docx\nSHA256:       a1b2c3d4e5f6a7b8...\nFile Type:    Microsoft Word Document (macro-enabled)\n\nPre-Screening:\n  VirusTotal:    34\u002F72 malicious (Emotet.Downloader)\n  MalwareBazaar: Tags: emotet, macro, downloader\n\nSandbox Analysis (Cuckoo):\n  Score:         9.2\u002F10 (MALICIOUS)\n  Signatures:\n    - Macro executes PowerShell download cradle (severity: 8)\n    - Process injection into explorer.exe (severity: 9)\n    - Connects to known Emotet C2 server (severity: 9)\n\nExtracted IOCs:\n  C2 IPs:       185.234.218[.]50:8080, 45.77.123[.]45:443\n  Domains:       update-service[.]evil[.]com\n  Dropped Files: payload.dll (SHA256: b2c3d4e5...)\n  Registry:      HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run\\Update\n\nVERDICT: MALICIOUS (Emotet Downloader) — Confidence: HIGH\nACTIONS:\n  [DONE] IOCs pushed to Splunk threat intel\n  [DONE] C2 IPs blocked on firewall\n  [DONE] Domain sinkholed on DNS\n  [DONE] Hash blocked on endpoint\n```\n",{"name":5,"tags":44,"author":49,"domain":37,"license":15,"version":50,"subdomain":51,"description":52},[22,45,38,46,47,48,29,20],"malware-analysis","automation","virustotal","cuckoo","mahipal","1.0","soc-operations","Builds an automated malware submission and analysis pipeline that collects suspicious files from endpoints and email gateways, submits them to sandbox environments and multi-engine scanners, and generates verdicts with IOCs for SIEM integration. Use when SOC teams need to scale malware analysis beyond manual sandbox submissions for high-volume alert triage.\n","main","4d2fb89cdfb75f3f6fd3c6c5ec9ad90ea129eb3c","ai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline",1,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai","https:\u002F\u002Fgithub.com\u002Fluokai0","a solo builder.","2026-05-06 04:29:04",{"source":8,"skillName":5,"commands":62,"prompt":72,"zipAvailable":73},[63,66,69],{"tool":64,"command":65},"npx","npx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill building-automated-malware-submission-pipeline",{"tool":67,"command":68},"bunx","bunx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill building-automated-malware-submission-pipeline",{"tool":70,"command":71},"pnpm","pnpm dlx skills add luokai0\u002Fai-agent-skills-by-luo-kai --skill building-automated-malware-submission-pipeline","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline\u002FSKILL.md",true,[75,81,87,93,97,102,106,112,116,120,124,128,132,136,140,144],{"path":76,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":79,"sourceHtmlUrl":80},"checklist.md","REFERENCE","参考文档",10101,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fchecklist.md",{"path":82,"resourceType":83,"resourceTypeDesc":84,"sizeBytes":85,"sourceHtmlUrl":86},"customize.toml","OTHER","其他",1639,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fcustomize.toml",{"path":88,"resourceType":89,"resourceTypeDesc":90,"sizeBytes":91,"sourceHtmlUrl":92},"documentation-requirements.csv","ASSET","资产文件",8076,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fdocumentation-requirements.csv",{"path":94,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":95,"sourceHtmlUrl":96},"instructions.md",8231,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Finstructions.md",{"path":98,"resourceType":98,"resourceTypeDesc":99,"sizeBytes":100,"sourceHtmlUrl":101},"LICENSE","许可证",11255,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline\u002FLICENSE",{"path":103,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":104,"sourceHtmlUrl":105},"references\u002Fapi-reference.md",1976,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline\u002Freferences\u002Fapi-reference.md",{"path":107,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":110,"sourceHtmlUrl":111},"scripts\u002Fagent.py","SCRIPT","脚本",7987,"https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F21-external-registries\u002F08-pinkpixel-collection\u002Fbuilding-automated-malware-submission-pipeline\u002Fscripts\u002Fagent.py",{"path":113,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":114,"sourceHtmlUrl":115},"templates\u002Fdeep-dive-template.md",5854,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Ftemplates\u002Fdeep-dive-template.md",{"path":117,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":118,"sourceHtmlUrl":119},"templates\u002Findex-template.md",4510,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Ftemplates\u002Findex-template.md",{"path":121,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":122,"sourceHtmlUrl":123},"templates\u002Fproject-overview-template.md",1951,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Ftemplates\u002Fproject-overview-template.md",{"path":125,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":126,"sourceHtmlUrl":127},"templates\u002Fproject-scan-report-schema.json",4821,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Ftemplates\u002Fproject-scan-report-schema.json",{"path":129,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":130,"sourceHtmlUrl":131},"templates\u002Fsource-tree-template.md",2160,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Ftemplates\u002Fsource-tree-template.md",{"path":133,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":134,"sourceHtmlUrl":135},"workflows\u002Fdeep-dive-instructions.md",11976,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fworkflows\u002Fdeep-dive-instructions.md",{"path":137,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":138,"sourceHtmlUrl":139},"workflows\u002Fdeep-dive-workflow.md",1036,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fworkflows\u002Fdeep-dive-workflow.md",{"path":141,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":142,"sourceHtmlUrl":143},"workflows\u002Ffull-scan-instructions.md",43206,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fworkflows\u002Ffull-scan-instructions.md",{"path":145,"resourceType":77,"resourceTypeDesc":78,"sizeBytes":146,"sourceHtmlUrl":147},"workflows\u002Ffull-scan-workflow.md",1047,"https:\u002F\u002Fgithub.com\u002Fdeveloperworks\u002Frust-supervisor\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgds-document-project\u002Fworkflows\u002Ffull-scan-workflow.md",[149,177,194,224,255,291],{"skillNo":150,"name":151,"nameZh":6,"description":152,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":156,"publishedAt":39},"01M6F2SKTE208174C7S7JJCZC7","write-contracts","Generates secure Aptos Move V2 smart contracts with Object model, Digital Asset integration, security patterns, and storage type guidance. Includes comprehensive storage decision framework for optimal data structure selection. Triggers on: 'write contract', 'create NFT collection', 'build marketplace', 'implement minting', 'generate Move module', 'create token contract', 'build DAO', 'implement staking'. Ask storage questions when: 'store', 'track', 'registry', 'mapping', 'list', 'collection'.","MIT","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fwrite-contracts\u002FSKILL.md",[],[157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176],"write","contracts","write contracts","storage","secure","create","generate","collection","model","decision","ask","smart-contracts","selection","objects","structure","nft","token","aptos","critical","move",{"skillNo":178,"name":179,"nameZh":6,"description":180,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":181,"categories":182,"keywords":183,"publishedAt":39},"01M6F2RFXJ6T9MKW0A7N7GM45B","web-search","通用网络搜索技能，支持多引擎搜索（百度、必应、DuckDuckGo），无需API密钥即可获取实时信息","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fweb-search-ex-skill\u002FSKILL.md",[],[184,185,186,187,188,189,190,191,192,193],"web","search","web search","搜索","baidu","bing","duckduckgo","百度","多引擎","internet",{"skillNo":195,"name":196,"nameZh":6,"description":197,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":198,"categories":199,"keywords":205,"publishedAt":39},"01M6F2K968G1FZEZFPW2E6B222","solo-build","Execute implementation plan tasks with TDD workflow, auto-commit, and phase gates. Use when user says \"build it\", \"start building\", \"execute plan\", \"implement tasks\", \"ship it\", or references a track ID. Do NOT use for planning (use \u002Fplan) or scaffolding (use \u002Fscaffold).","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fsolo-build\u002FSKILL.md",[200],{"categoryNo":201,"categoryName":202,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[206,207,208,209,210,211,212,213,185,214,215,216,157,217,218,219,220,221,222,223],"build","solo","solo build","MCP","workflow","commit","tasks","code","Bash","plan","read","auto","references","context7","query","scaffolding","ship it","project",{"skillNo":225,"name":226,"nameZh":6,"description":227,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":228,"categories":229,"keywords":236,"publishedAt":39},"01M6F2GKN39SGHSPWYB3662YC8","react-email","Use when building HTML email templates with React components, adding a visual email editor to an application using the React Email visual editor, rendering emails to HTML, or sending emails with Resend. Covers welcome emails, password resets, notifications, order confirmations, newsletters, transactional emails, and the embeddable email editor component.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Freact-email-skills\u002FSKILL.md",[230,233],{"categoryNo":231,"categoryName":232,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000005","邮件与沟通",{"categoryNo":234,"categoryName":235,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000009","前端开发",[237,32,238,239,240,241,242,243,244,245,246,247,248,26,249,250,251,252,253,254],"react","react email","github","editor","components","react components","component","welcome","https","notifications","password","node","html","resend","visual","emails","rendering","with",{"skillNo":256,"name":257,"nameZh":6,"description":258,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":259,"categories":260,"keywords":273,"publishedAt":39},"01M6F2FBVGVDFSG8SSFJGXA40C","APITester Agent-Driven API Testing","Test API endpoints and document responses. Define tests in plain English, run them, get formatted results. Agent-driven Postman alternative.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fopenclaw-api-tester\u002FSKILL.md",[261,264,267,268],{"categoryNo":262,"categoryName":263,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":265,"categoryName":266,"taxonomyType":203,"taxonomyTypeDesc":204},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":201,"categoryName":202,"taxonomyType":203,"taxonomyTypeDesc":204},{"categoryNo":269,"categoryName":270,"taxonomyType":271,"taxonomyTypeDesc":272},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[274,275,276,277,278,279,34,280,281,282,283,284,285,286,287,288,289,290],"testing","api","api testing","driven","APITester Agent Driven API Testing","test","postman","results","plain english","tester","endpoints","document","get","define","tests","english","api-tester",{"skillNo":292,"name":293,"nameZh":6,"description":294,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":153,"licenseFileUrl":6,"sourceHtmlUrl":295,"categories":296,"keywords":297,"publishedAt":39},"01M6F273Y3NGAPVJZ608BC0G9G","hubspot-implementation-plan","Generate a phased implementation plan from a HubSpot audit report. Creates prioritized, sequenced cleanup processes with effort estimates, dependencies, and automation feasibility. Use after running \u002Fhubspot-audit.","https:\u002F\u002Fgithub.com\u002Fluokai0\u002Fai-agent-skills-by-luo-kai\u002Fblob\u002Fmain\u002Fai-agent-skills\u002F22-clawhub-skills\u002Fhubspot-implementation-plan\u002FSKILL.md",[],[215,298,299,300,46,301,302,163,303,304,305,306,307,26,308,309,254,310],"implementation","hubspot","hubspot implementation plan","feasibility","cleanup","planning","report","audit","audit report","phased implementation","dependencies","processes","hubspot audit"]