{"data":{"skill":{"slug":"sickn33-impress","name":"impress","icon":"📦","repo":"https://github.com/sickn33/antigravity-awesome-skills/tree/main/skills/libreoffice/impress","status":"approved","author":"sickn33","authorVersion":null,"skillstoreRevision":2},"audit":{"id":"c20702b3-82b3-491b-8703-5276245c56e0","skill_id":"c17fb593-ffeb-4c4e-9d02-190ab9a9c57a","version":6,"content_hash":"v3:88a8e9a07f4c54ab105c1c41b6267c287146b07b:c8d4cb29afd6b487b2c9d06f641d26b5e0fb315cc5a1c1319f6bd4f226ad1fda:652ae5780e9d818ce5bd4ba56bdb4f0db5f3f5e5f538bebfae36d624bd8cf041:736b696c6c732f7369636b6e33332f696d7072657373:74267b9ca93cd4e9a2ddceb893e7a401","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"Most static alerts are scanner artifacts from Markdown fences, local conversion commands, temporary directory use, and official documentation links. One static finding is confirmed because the troubleshooting command opens an unauthenticated localhost UNO listener; semantic review also found broad process termination, unbounded archive extraction, unescaped XML insertion, and unpinned package installation.","remediation":[{"issue":"The troubleshooting workflow terminates every soffice.bin process.","severity":"medium","suggestion":"Track the automation process ID and stop only that process after confirming no unsaved presentation work will be lost."},{"issue":"Template archives are extracted without entry validation or resource limits.","severity":"medium","suggestion":"Validate archive paths and expanded size, reject links, cap resource use, and fail when extraction returns an error."},{"issue":"Template values are inserted into content.xml without XML escaping.","severity":"medium","suggestion":"Use a structured XML library and insert values as escaped text nodes before rebuilding the ODP archive."},{"issue":"The UNO listener accepts local socket connections without authentication.","severity":"low","suggestion":"Use an isolated LibreOffice profile, start the listener only when required, and stop it immediately after automation."},{"issue":"Python package installation examples do not pin versions or verify artifacts.","severity":"medium","suggestion":"Pin reviewed versions, use a trusted package index, and verify hashes in reproducible environments."}],"risk_factor_evidence":[{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":110,"line_start":110},{"file":"SKILL.md","line_end":116,"line_start":116},{"file":"SKILL.md","line_end":62,"line_start":60},{"file":"SKILL.md","line_end":65,"line_start":62},{"file":"SKILL.md","line_end":82,"line_start":65},{"file":"SKILL.md","line_end":86,"line_start":82},{"file":"SKILL.md","line_end":100,"line_start":86},{"file":"SKILL.md","line_end":103,"line_start":100},{"file":"SKILL.md","line_end":118,"line_start":103},{"file":"SKILL.md","line_end":130,"line_start":118},{"file":"SKILL.md","line_end":134,"line_start":130},{"file":"SKILL.md","line_end":138,"line_start":134},{"file":"SKILL.md","line_end":141,"line_start":138},{"file":"SKILL.md","line_end":156,"line_start":141},{"file":"SKILL.md","line_end":159,"line_start":156}]},{"factor":"network","evidence":[{"file":"SKILL.md","line_end":163,"line_start":163},{"file":"SKILL.md","line_end":164,"line_start":164}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":105,"line_start":105},{"file":"SKILL.md","line_end":109,"line_start":109}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Broad Process Termination Can Cause Data Loss","locations":[{"file":"SKILL.md","line_end":157,"line_start":157}],"confidence":0.97,"description":"The troubleshooting command terminates every soffice.bin process, including unrelated sessions with unsaved presentations, without confirmation or process scoping.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The documented killall command explicitly targets every process with the matching name, so unrelated LibreOffice sessions can be terminated."},{"title":"Unbounded Template Archive Extraction","locations":[{"file":"SKILL.md","line_end":110,"line_start":108}],"confidence":0.9,"description":"The template workflow extracts a supplied archive without checking entries, links, expanded size, or resource limits, enabling disk exhaustion or unsafe archive contents.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The template path is accepted directly and passed to unzip without validation or extraction limits."},{"title":"Unescaped XML Template Injection","locations":[{"file":"SKILL.md","line_end":115,"line_start":112}],"confidence":0.96,"description":"Placeholder values are inserted directly into content.xml, allowing supplied text to break XML structure or inject unintended ODF markup.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The example performs direct string replacement with str(value) and does not use XML parsing or escaping."},{"title":"Unpinned Python Package Installation","locations":[{"file":"SKILL.md","line_end":140,"line_start":139}],"confidence":0.95,"description":"The installation examples fetch latest package versions without pins or hashes, increasing dependency drift and package supply-chain exposure.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Both pip commands omit versions and integrity hashes, so installation results can change without review."}],"low_findings":[{"title":"Network reconnaissance","locations":[{"file":"SKILL.md","line_end":158,"line_start":158}],"confidence":0.78,"description":"soffice --headless --accept=\"socket,host=localhost,port=8100;urp;\"","review_kind":"security","source_category":"blocker","source_severity":"low","confidence_reasoning":"The command starts a UNO socket listener on localhost without authentication. Any local process able to reach port 8100 could attempt to control the LibreOffice automation session."}],"dangerous_patterns":[{"title":"Network reconnaissance","locations":[{"file":"SKILL.md","line_end":158,"line_start":158}],"confidence":0.78,"description":"soffice --headless --accept=\"socket,host=localhost,port=8100;urp;\"","review_kind":"security","source_category":"blocker","source_severity":"low","confidence_reasoning":"The command starts a UNO socket listener on localhost without authentication. Any local process able to reach port 8100 could attempt to control the LibreOffice automation session."}],"files_scanned":1,"total_lines":179,"audit_model":"codex","audited_at":"2026-07-24T00:59:21.591+00:00","created_at":"2026-07-26T15:23:44.796683+00:00","static_findings":[{"id":"external_commands:SKILL.md:110:python-subprocess-run","file":"SKILL.md","pattern":"Python subprocess.run","snippet":"subprocess.run(['unzip', '-q', template_path, '-d', tmpdir])","category":"external_commands","line_end":110,"severity":"high","line_start":110},{"id":"external_commands:SKILL.md:116:python-subprocess-run","file":"SKILL.md","pattern":"Python subprocess.run","snippet":"subprocess.run(['zip', '-rq', output_path, '.'], cwd=tmpdir)","category":"external_commands","line_end":116,"severity":"high","line_start":116},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":62,"severity":"medium","line_start":60},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":65,"severity":"medium","line_start":62},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```python","category":"external_commands","line_end":82,"severity":"medium","line_start":65},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":86,"severity":"medium","line_start":82},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":100,"severity":"medium","line_start":86},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":103,"severity":"medium","line_start":100},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```python","category":"external_commands","line_end":118,"severity":"medium","line_start":103},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":130,"severity":"medium","line_start":118},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":134,"severity":"medium","line_start":130},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":138,"severity":"medium","line_start":134},{"id":"external_commands:SKILL.md:138:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":141,"severity":"medium","line_start":138},{"id":"external_commands:SKILL.md:141:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":156,"severity":"medium","line_start":141},{"id":"external_commands:SKILL.md:156:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":159,"severity":"medium","line_start":156},{"id":"network:SKILL.md:163:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- [LibreOffice Impress Guide](https://documentation.libreoffice.org/)","category":"network","line_end":163,"severity":"low","line_start":163},{"id":"network:SKILL.md:164:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"- [UNO API Reference](https://api.libreoffice.org/)","category":"network","line_end":164,"severity":"low","line_start":164},{"id":"filesystem:SKILL.md:105:temp-file-creation","file":"SKILL.md","pattern":"Temp file creation","snippet":"import tempfile","category":"filesystem","line_end":105,"severity":"low","line_start":105},{"id":"filesystem:SKILL.md:109:temp-file-creation","file":"SKILL.md","pattern":"Temp file creation","snippet":"with tempfile.TemporaryDirectory() as tmpdir:","category":"filesystem","line_end":109,"severity":"low","line_start":109},{"id":"blocker:SKILL.md:88:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --convert-to pptx presentation.odp","category":"blocker","line_end":88,"severity":"low","line_start":88},{"id":"blocker:SKILL.md:91:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --convert-to pdf presentation.odp","category":"blocker","line_end":91,"severity":"low","line_start":91},{"id":"blocker:SKILL.md:94:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --convert-to odp presentation.pptx","category":"blocker","line_end":94,"severity":"low","line_start":94},{"id":"blocker:SKILL.md:98:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --convert-to pdf \"$file\"","category":"blocker","line_end":98,"severity":"low","line_start":98},{"id":"blocker:SKILL.md:132:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --convert-to <format> <file>","category":"blocker","line_end":132,"severity":"low","line_start":132},{"id":"blocker:SKILL.md:158:network-reconnaissance","file":"SKILL.md","pattern":"Network reconnaissance","snippet":"soffice --headless --accept=\"socket,host=localhost,port=8100;urp;\"","category":"blocker","line_end":158,"severity":"low","line_start":158}],"finding_verdicts":[{"id":"external_commands:SKILL.md:110:python-subprocess-run","reason":"The example invokes a fixed unzip executable with an argument list and no shell interpolation. External execution is expected for the documented archive workflow, although archive validation remains necessary.","verdict":"false_positive","confidence":0.84},{"id":"external_commands:SKILL.md:116:python-subprocess-run","reason":"The example invokes a fixed zip executable with structured arguments and no shell. This does not provide a shell command-injection path.","verdict":"false_positive","confidence":0.86},{"id":"external_commands:SKILL.md:60:ruby-shell-backtick-execution","reason":"Line 60 is a Markdown code-fence marker for a Bash example, not Ruby backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:62:ruby-shell-backtick-execution","reason":"Line 62 closes a Markdown code block. It does not execute a shell command.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:65:ruby-shell-backtick-execution","reason":"Line 65 opens a fenced Python example. The backticks are documentation syntax, not command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:82:ruby-shell-backtick-execution","reason":"Line 82 closes a Markdown code block and contains no executable backtick expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:86:ruby-shell-backtick-execution","reason":"Line 86 is a Bash code-fence marker in documentation, not Ruby or shell backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:100:ruby-shell-backtick-execution","reason":"Line 100 closes the documented conversion example. The backticks are not executable.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:103:ruby-shell-backtick-execution","reason":"Line 103 opens a fenced Python example and does not perform backtick command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:118:ruby-shell-backtick-execution","reason":"Line 118 is only the closing fence for the Python example.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:130:ruby-shell-backtick-execution","reason":"Line 130 opens a Bash documentation block. It is not an executable backtick expression.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:134:ruby-shell-backtick-execution","reason":"Line 134 closes a Markdown code block and contains no command execution.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:138:ruby-shell-backtick-execution","reason":"Line 138 opens a Bash installation example. The Markdown fence itself is harmless.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:141:ruby-shell-backtick-execution","reason":"Line 141 closes the installation example and is not executable syntax.","verdict":"false_positive","confidence":0.99},{"id":"external_commands:SKILL.md:156:ruby-shell-backtick-execution","reason":"Line 156 is a Markdown fence for troubleshooting commands, not backtick execution.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:163:hardcoded-url","reason":"This is a passive link to the official LibreOffice documentation site. The skill does not automatically request or transmit data to it.","verdict":"false_positive","confidence":0.99},{"id":"network:SKILL.md:164:hardcoded-url","reason":"This is a passive link to the official LibreOffice API reference. It does not cause network access or data disclosure.","verdict":"false_positive","confidence":0.99},{"id":"filesystem:SKILL.md:105:temp-file-creation","reason":"The line only imports Python's standard tempfile module for an archive-processing example.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:109:temp-file-creation","reason":"TemporaryDirectory creates an isolated temporary workspace and removes it when the context exits. This is appropriate for transient ODP processing.","verdict":"false_positive","confidence":0.96},{"id":"blocker:SKILL.md:88:network-reconnaissance","reason":"The command converts a local ODP file to PPTX with LibreOffice. It performs no network discovery.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:91:network-reconnaissance","reason":"The command performs a local ODP-to-PDF conversion and contains no reconnaissance behavior.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:94:network-reconnaissance","reason":"The command converts a local PPTX file to ODP. It does not inspect or enumerate a network.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:98:network-reconnaissance","reason":"This is a quoted local filename inside a batch conversion loop. No network target or discovery operation is present.","verdict":"false_positive","confidence":0.98},{"id":"blocker:SKILL.md:132:network-reconnaissance","reason":"This is a placeholder syntax example for local format conversion, not a reconnaissance command.","verdict":"false_positive","confidence":0.99},{"id":"blocker:SKILL.md:158:network-reconnaissance","reason":"The command starts a UNO socket listener on localhost without authentication. Any local process able to reach port 8100 could attempt to control the LibreOffice automation session.","verdict":"confirmed","severity":"low","confidence":0.78}],"semantic_findings":[{"title":"Broad Process Termination Can Cause Data Loss","severity":"medium","locations":[{"file":"SKILL.md","line_end":157,"line_start":157}],"confidence":0.97,"description":"The troubleshooting command terminates every soffice.bin process, including unrelated sessions with unsaved presentations, without confirmation or process scoping.","confidence_reasoning":"The documented killall command explicitly targets every process with the matching name, so unrelated LibreOffice sessions can be terminated."},{"title":"Unbounded Template Archive Extraction","severity":"medium","locations":[{"file":"SKILL.md","line_end":110,"line_start":108}],"confidence":0.9,"description":"The template workflow extracts a supplied archive without checking entries, links, expanded size, or resource limits, enabling disk exhaustion or unsafe archive contents.","confidence_reasoning":"The template path is accepted directly and passed to unzip without validation or extraction limits."},{"title":"Unescaped XML Template Injection","severity":"medium","locations":[{"file":"SKILL.md","line_end":115,"line_start":112}],"confidence":0.96,"description":"Placeholder values are inserted directly into content.xml, allowing supplied text to break XML structure or inject unintended ODF markup.","confidence_reasoning":"The example performs direct string replacement with str(value) and does not use XML parsing or escaping."},{"title":"Unpinned Python Package Installation","severity":"medium","locations":[{"file":"SKILL.md","line_end":140,"line_start":139}],"confidence":0.95,"description":"The installation examples fetch latest package versions without pins or hashes, increasing dependency drift and package supply-chain exposure.","confidence_reasoning":"Both pip commands omit versions and integrity hashes, so installation results can change without review."}],"subject_marketplace_commit_sha":"88a8e9a07f4c54ab105c1c41b6267c287146b07b","subject_content_hash":"c8d4cb29afd6b487b2c9d06f641d26b5e0fb315cc5a1c1319f6bd4f226ad1fda","subject_tree_hash":"652ae5780e9d818ce5bd4ba56bdb4f0db5f3f5e5f538bebfae36d624bd8cf041","subject_plugin_path":"skills/sickn33/impress","audit_payload_hash":"74267b9ca93cd4e9a2ddceb893e7a401","confirmed_risk_level":"medium","scanner_version":"3.0.0","policy_version":"skillstore-security-audit-policy-v1","subject":{"marketplaceCommitSha":"88a8e9a07f4c54ab105c1c41b6267c287146b07b","contentHash":"c8d4cb29afd6b487b2c9d06f641d26b5e0fb315cc5a1c1319f6bd4f226ad1fda","treeHash":"652ae5780e9d818ce5bd4ba56bdb4f0db5f3f5e5f538bebfae36d624bd8cf041","pluginPath":"skills/sickn33/impress","auditPayloadHash":"74267b9ca93cd4e9a2ddceb893e7a401"},"scannerVersion":"3.0.0","policyVersion":"skillstore-security-audit-policy-v1"},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"issued","url":"/api/skills/sickn33-impress/audits/6/attestation","status":"active"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":5,"capabilityReviewCount":0,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"active","verificationState":"not_verified"},"isLatest":true}}