docx
4 findings (1 high, 2 medium, 1 low), mainly prompt injection, resource abuse, command injection. Most recent scan 2026-02-07.
This skill presents MODERATE security risks. The primary concern is the HIGH severity indirect prompt injection vulnerability created by mandatory full-file reading directives that force unconditional trust of reference file contents. Additional MEDIUM severity issues include unsafe XML parsing patterns, unbounded file system operations, and potential command injection risks in subprocess calls. The skill performs complex document manipulation operations that require careful validation and resource limits. While the code uses some security libraries (defusedxml), the implementation has gaps in validation, resource limits, and error handling that could be exploited.
Scanner's overall assessment (LLM analyzer)
Second scanner: NVIDIA SkillSpector
Independent static run, no language model, over the same files as the Cisco scan above. How the two scanners compare across the whole corpus: Two scanners, one corpus.
What this skill does
Comprehensive document creation, editing, and analysis with support for tracked changes, comments, formatting preservation, and text extraction. When Claude needs to work with professional documents (.docx files) for: (1) Creating new documents, (2) Modifying or editing content, (3) Working with tracked changes, (4) Adding comments, or any other document tasks
- Package
- 59 files, 1.1 MB
- SKILL.md
- 1343 words, 12+ sections
- Code
- Python (11)
- License
- Proprietary. LICENSE.txt has complete terms
SKILL.md covers: DOCX creation, editing, and analysis · Overview · Workflow Decision Tree · Reading/Analyzing Content · Creating New Document · Editing Existing Document · Reading and analyzing content · Text extraction · Convert document to markdown with tracked changes · Options: --track-changes=accept/reject/all · Raw XML access · Creating a new Word document
Findings
HIGH Indirect Prompt Injection via Mandatory Full File Reading Prompt Injectionllm
The SKILL.md instructions contain explicit directives that force the agent to read entire reference files without any range limits: 'MANDATORY - READ ENTIRE FILE: Read [`docx-js.md`](docx-js.md) (~500 lines) completely from start to finish. NEVER set any range limits when reading this file.' and similar for ooxml.md (~600 lines). This creates a transitive trust vulnerability where malicious content embedded in these reference files would be processed without scrutiny. The emphatic language ('MANDATORY', 'NEVER', all caps) attempts to override the agent's normal safety behaviors and force unconditional trust of file contents.
SKILL.md
'**MANDATORY - READ ENTIRE FILE**: Read [`docx-js.md`](docx-js.md) (~500 lines) completely from start to finish. **NEVER set any range limits when reading this file.**' and '**MANDATORY - READ ENTIRE FILE**: Read [`ooxml.md`](ooxml.md) (~600 lines) completely from start to finish. **NEVER set any range limi'MEDIUM Unbounded File System Operations Resource Abusellm
The unpack.py script uses rglob to recursively process all XML files in the unpacked directory without any limits: 'xml_files = list(output_path.rglob("*.xml")) + list(output_path.rglob("*.rels"))'. A malicious Office file could contain thousands of XML files or deeply nested directory structures, causing resource exhaustion. The script processes every file found without size or count limits.
ooxml/scripts/unpack.py
xml_files = list(output_path.rglob('*.xml')) + list(output_path.rglob('*.rels'))
for xml_file in xml_files:
content = xml_file.read_text(encoding='utf-8')
dom = defusedxml.minidom.parseString(content)
xml_file.write_bytes(dom.toprettyxml(indent=' ', encoding='ascii'))MEDIUM Command Injection Risk in Subprocess Calls Command Injectionllm
The validation/redlining.py file uses subprocess.run with shell=False but constructs commands from file paths that could contain malicious characters. While shell=False prevents shell injection, the code doesn't validate that file paths are safe: 'subprocess.run(["pandoc", "--track-changes=all", str(original_docx), "-o", str(original_md)], capture_output=True, text=True, check=True)'. If file paths contain special characters or are manipulated, this could lead to unexpected behavior.
ooxml/scripts/validation/redlining.py
subprocess.run(["pandoc", "--track-changes=all", str(original_docx), "-o", str(original_md)], capture_output=True, text=True, check=True)LOW Temporary File Cleanup Not Guaranteed Data Exfiltrationllm
Multiple scripts create temporary directories and files but don't guarantee cleanup on error. In pack.py and validation scripts, temporary directories are created with tempfile.mkdtemp() but cleanup only happens in the success path. If an exception occurs, temporary files may be left on disk, potentially containing sensitive document content.
ooxml/scripts/pack.py
temp_dir = tempfile.mkdtemp()
# ... operations ...
shutil.rmtree(temp_dir) # Only called if no exceptionWhat is in the package
59 files, 1.1 MB. Show the list.
| File | Kind | Size |
|---|---|---|
LICENSE.txt | doc | 1.4 KB |
SKILL.md | doc | 9.9 KB |
docx-js.md | doc | 16 KB |
ooxml.md | doc | 23 KB |
scripts/__init__.py | script | 65 B |
scripts/document.py | script | 49 KB |
scripts/utilities.py | script | 13 KB |
ooxml/scripts/pack.py | script | 5.5 KB |
ooxml/scripts/unpack.py | script | 1.0 KB |
ooxml/scripts/validate.py | script | 1.9 KB |
scripts/templates/comments.xml | config | 2.6 KB |
scripts/templates/commentsExtended.xml | config | 2.6 KB |
scripts/templates/commentsExtensible.xml | config | 2.7 KB |
scripts/templates/commentsIds.xml | config | 2.6 KB |
scripts/templates/people.xml | config | 147 B |
ooxml/schemas/ISO-IEC29500-4_2016/dml-chart.xsd | other | 73 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-chartDrawing.xsd | other | 6.8 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-diagram.xsd | other | 50 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-lockedCanvas.xsd | other | 624 B |
ooxml/schemas/ISO-IEC29500-4_2016/dml-main.xsd | other | 148 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-picture.xsd | other | 1.2 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-spreadsheetDrawing.xsd | other | 8.7 KB |
ooxml/schemas/ISO-IEC29500-4_2016/dml-wordprocessingDrawing.xsd | other | 14 KB |
ooxml/schemas/ISO-IEC29500-4_2016/pml.xsd | other | 82 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-additionalCharacteristics.xsd | other | 1.2 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-bibliography.xsd | other | 7.2 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-commonSimpleTypes.xsd | other | 6.2 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlDataProperties.xsd | other | 1.2 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-customXmlSchemaProperties.xsd | other | 880 B |
ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesCustom.xsd | other | 2.5 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesExtended.xsd | other | 3.4 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-documentPropertiesVariantTypes.xsd | other | 7.3 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-math.xsd | other | 23 KB |
ooxml/schemas/ISO-IEC29500-4_2016/shared-relationshipReference.xsd | other | 1.3 KB |
ooxml/schemas/ISO-IEC29500-4_2016/sml.xsd | other | 237 KB |
ooxml/schemas/ISO-IEC29500-4_2016/vml-main.xsd | other | 26 KB |
ooxml/schemas/ISO-IEC29500-4_2016/vml-officeDrawing.xsd | other | 25 KB |
ooxml/schemas/ISO-IEC29500-4_2016/vml-presentationDrawing.xsd | other | 535 B |
ooxml/schemas/ISO-IEC29500-4_2016/vml-spreadsheetDrawing.xsd | other | 5.6 KB |
ooxml/schemas/ISO-IEC29500-4_2016/vml-wordprocessingDrawing.xsd | other | 3.9 KB |
ooxml/schemas/ISO-IEC29500-4_2016/wml.xsd | other | 167 KB |
ooxml/schemas/ISO-IEC29500-4_2016/xml.xsd | other | 4.5 KB |
ooxml/schemas/mce/mc.xsd | other | 3.1 KB |
ooxml/schemas/microsoft/wml-2010.xsd | other | 26 KB |
ooxml/schemas/microsoft/wml-2012.xsd | other | 3.7 KB |
ooxml/schemas/microsoft/wml-2018.xsd | other | 901 B |
ooxml/schemas/microsoft/wml-cex-2018.xsd | other | 1.7 KB |
ooxml/schemas/microsoft/wml-cid-2016.xsd | other | 1002 B |
ooxml/schemas/microsoft/wml-sdtdatahash-2020.xsd | other | 600 B |
ooxml/schemas/microsoft/wml-symex-2015.xsd | other | 745 B |
ooxml/scripts/validation/__init__.py | script | 336 B |
ooxml/scripts/validation/base.py | script | 39 KB |
ooxml/scripts/validation/docx.py | script | 9.8 KB |
ooxml/scripts/validation/pptx.py | script | 12 KB |
ooxml/scripts/validation/redlining.py | script | 11 KB |
ooxml/schemas/ecma/fouth-edition/opc-contentTypes.xsd | other | 1.9 KB |
ooxml/schemas/ecma/fouth-edition/opc-coreProperties.xsd | other | 2.5 KB |
ooxml/schemas/ecma/fouth-edition/opc-digSig.xsd | other | 2.8 KB |
ooxml/schemas/ecma/fouth-edition/opc-relationships.xsd | other | 1.3 KB |
External hosts referenced
schemas.openxmlformats.org schemas.microsoft.com purl.org dublincore.org www.anthropic.com github.com www.google.com
Hostnames that appear in the skill's files. Referencing a host is not a finding; compare against the findings above and the skill's stated purpose.
Package contents recorded 2026-10-22 at commit 69c0b1a06741. The scan above ran against the version current at scan time; the two can differ if the skill has since been updated.
What we checked
- Static analyzer. Pattern rules over SKILL.md and bundled files: known-bad commands, exfiltration URLs, secrets, obfuscation.
- Llm analyzer. A language model reads the skill and reports intent-level issues the rules cannot express.
- Meta analyzer. A second model pass that validates, deduplicates and re-scores the other analyzers' findings.
What we did not check
- Runtime behaviour. The skill was not executed; findings come from reading its files.
- Anything fetched at install or run time, including remote scripts, package dependencies, and URLs the skill tells the agent to open.
- Content the analyzers cannot read: images, binaries, and some non-English text.
- Known scanner bypass classes. See the methodology and limitations page.
Sources
- Repository: https://github.com/anthropics/skills/tree/main/skills/docx
- Raw scan result: skills-docx-scan.json
- Badge for your README:
 - Request a re-scan