{"data":{"skill":{"slug":"caopulan-bark-notify","name":"bark-notify","icon":"📦","repo":"https://github.com/caopulan/Notification-Skill/tree/main/bark-notify","status":"approved","author":"caopulan","authorVersion":null,"skillstoreRevision":null},"audit":{"id":"6bce6052-1458-45d2-b180-ff8f4704bc3c","skill_id":"f6ae5791-096e-4494-9f58-9cff714ded5b","version":7,"content_hash":"73fdada334762dd5428eac695f31bf91","risk_level":"medium","is_blocked":false,"safe_to_publish":true,"analysis_status":"ok","agent_auto_install_policy":"allowed","manual_install_policy":"allowed","summary":"The skill intentionally sends Bark push notifications, so outbound network use and selected environment access are expected. I confirmed real risks around sending task metadata, reading the Bark key, executing the helper command, and dry-run output that can reveal the token. Most high filesystem and path traversal alerts are false positives from documentation placeholders and standard Codex paths.","remediation":[{"issue":"Dry-run output can expose the Bark key.","severity":"medium","suggestion":"Mask the Bark key when printing dry-run URLs, or print only the destination host."},{"issue":"Notification payloads can include sensitive task details.","severity":"medium","suggestion":"Redact secrets and keep summaries minimal before sending notifications to Bark."},{"issue":"The documented shell command accepts generated text arguments.","severity":"medium","suggestion":"Document safe argument quoting, or provide a wrapper that passes arguments without shell interpolation."},{"issue":"The helper allows a configurable Bark base URL.","severity":"low","suggestion":"Validate the base URL scheme and document that only trusted Bark endpoints should be used."}],"risk_factor_evidence":[{"factor":"network","evidence":[{"file":"scripts/send_bark_notification.py","line_end":88,"line_start":88},{"file":"SKILL.md","line_end":19,"line_start":19},{"file":"SKILL.md","line_end":20,"line_start":20}]},{"factor":"env_access","evidence":[{"file":"scripts/send_bark_notification.py","line_end":86,"line_start":86},{"file":"scripts/send_bark_notification.py","line_end":87,"line_start":87},{"file":"scripts/send_bark_notification.py","line_end":88,"line_start":88}]},{"factor":"external_commands","evidence":[{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":21,"line_start":17},{"file":"SKILL.md","line_end":32,"line_start":21},{"file":"SKILL.md","line_end":33,"line_start":32},{"file":"SKILL.md","line_end":33,"line_start":33},{"file":"SKILL.md","line_end":34,"line_start":34},{"file":"SKILL.md","line_end":40,"line_start":40},{"file":"SKILL.md","line_end":51,"line_start":45},{"file":"SKILL.md","line_end":55,"line_start":51}]},{"factor":"filesystem","evidence":[{"file":"SKILL.md","line_end":47,"line_start":47},{"file":"SKILL.md","line_end":49,"line_start":49},{"file":"SKILL.md","line_end":50,"line_start":50},{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":46,"line_start":46},{"file":"SKILL.md","line_end":16,"line_start":16},{"file":"SKILL.md","line_end":46,"line_start":46}]}],"critical_findings":[],"high_findings":[],"medium_findings":[{"title":"Ruby/shell backtick execution","locations":[{"file":"SKILL.md","line_end":51,"line_start":45}],"confidence":0.84,"description":"```bash","review_kind":"capability","source_category":"external_commands","source_severity":"medium","confidence_reasoning":"The markdown block instructs the agent to run python3 against the bundled helper script. This external command is expected, but generated arguments require careful quoting."},{"title":"Dry-run Output Can Disclose Bark Key","locations":[{"file":"scripts/send_bark_notification.py","line_end":122,"line_start":118}],"confidence":0.9,"description":"The helper builds the request URL with CODEX_BARK_KEY and prints that full URL during dry-run mode. Logs or copied output can expose the notification token.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"Line 118 embeds the Bark key in the URL, and line 122 prints that URL during dry-run. This is direct credential exposure to local output."},{"title":"Task Metadata Is Sent To External Push Service","locations":[{"file":"scripts/send_bark_notification.py","line_end":119,"line_start":109},{"file":"scripts/send_bark_notification.py","line_end":130,"line_start":127}],"confidence":0.86,"description":"The notification body includes device, project, status, and summary fields before posting to Bark. Sensitive project details can leave the local environment if summaries are too broad.","review_kind":"security","source_category":"semantic","source_severity":"medium","confidence_reasoning":"The code constructs a payload from task metadata and sends it with urllib. This is intended behavior, but the privacy risk is clear from the data fields."}],"low_findings":[{"title":"Hardcoded URL","locations":[{"file":"scripts/send_bark_notification.py","line_end":88,"line_start":88}],"confidence":0.82,"description":"base_url = os.environ.get(\"CODEX_BARK_BASE_URL\", \"https://api.day.app\")","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The helper defaults to https://api.day.app and later posts task notification data to that endpoint. This is expected for Bark, but it is intentional outbound network behavior."},{"title":"Python environment access","locations":[{"file":"scripts/send_bark_notification.py","line_end":86,"line_start":86}],"confidence":0.74,"description":"machine_name = os.environ.get(\"CODEX_MACHINE_NAME\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"The machine name is read from the environment and included in the notification body sent externally. It is not a secret, but it can identify the user device."},{"title":"Python environment access","locations":[{"file":"scripts/send_bark_notification.py","line_end":87,"line_start":87}],"confidence":0.88,"description":"bark_key = os.environ.get(\"CODEX_BARK_KEY\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"CODEX_BARK_KEY is a Bark credential used in the request URL. Reading it is required, but mishandling can disclose a notification token."},{"title":"Python environment access","locations":[{"file":"scripts/send_bark_notification.py","line_end":88,"line_start":88}],"confidence":0.7,"description":"base_url = os.environ.get(\"CODEX_BARK_BASE_URL\", \"https://api.day.app\")","review_kind":"capability","source_category":"env_access","source_severity":"low","confidence_reasoning":"CODEX_BARK_BASE_URL controls the outbound notification destination. This is legitimate configuration, but it can redirect posted task data if set incorrectly."},{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":19,"line_start":19}],"confidence":0.72,"description":"export CODEX_BARK_KEY=\"\" # https://api.day.app/<CODEX_BARK_KEY>/","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The documentation shows the Bark API URL used with the notification key. It reflects the skill's intended external service, which users should understand before enabling."},{"title":"Hardcoded URL","locations":[{"file":"SKILL.md","line_end":20,"line_start":20}],"confidence":0.75,"description":"export CODEX_BARK_BASE_URL=\"https://api.day.app\"","review_kind":"capability","source_category":"network","source_severity":"low","confidence_reasoning":"The setup example configures https://api.day.app as the notification endpoint. This is expected, but confirms the skill depends on an external network service."}],"dangerous_patterns":[],"files_scanned":2,"total_lines":202,"audit_model":"codex","audited_at":"2026-07-05T07:13:44.335+00:00","created_at":"2026-07-05T08:31:40.859636+00:00","static_findings":[{"id":"network:scripts/send_bark_notification.py:88:hardcoded-url","file":"scripts/send_bark_notification.py","pattern":"Hardcoded URL","snippet":"base_url = os.environ.get(\"CODEX_BARK_BASE_URL\", \"https://api.day.app\")","category":"network","line_end":88,"severity":"low","line_start":88},{"id":"env_access:scripts/send_bark_notification.py:86:python-environment-access","file":"scripts/send_bark_notification.py","pattern":"Python environment access","snippet":"machine_name = os.environ.get(\"CODEX_MACHINE_NAME\")","category":"env_access","line_end":86,"severity":"low","line_start":86},{"id":"env_access:scripts/send_bark_notification.py:87:python-environment-access","file":"scripts/send_bark_notification.py","pattern":"Python environment access","snippet":"bark_key = os.environ.get(\"CODEX_BARK_KEY\")","category":"env_access","line_end":87,"severity":"low","line_start":87},{"id":"env_access:scripts/send_bark_notification.py:88:python-environment-access","file":"scripts/send_bark_notification.py","pattern":"Python environment access","snippet":"base_url = os.environ.get(\"CODEX_BARK_BASE_URL\", \"https://api.day.app\")","category":"env_access","line_end":88,"severity":"low","line_start":88},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"You can add the following lines to `~/.bashrc` (Linux) or `~/.zshrc` (macOS) to set environment vari","category":"external_commands","line_end":16,"severity":"medium","line_start":16},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":21,"severity":"medium","line_start":17},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":32,"severity":"medium","line_start":21},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- To override the folder name, define a project name in `AGENTS.md` using one of:","category":"external_commands","line_end":33,"severity":"medium","line_start":32},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- YAML frontmatter: `project_name: My Project` (or `name:`)","category":"external_commands","line_end":33,"severity":"medium","line_start":33},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- A plain line: `Project Name: My Project` or `项目名称:我的项目`","category":"external_commands","line_end":34,"severity":"medium","line_start":34},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"- Pick an execution status: `success`, `failed`, `partial`, `blocked`, etc.","category":"external_commands","line_end":40,"severity":"medium","line_start":40},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```bash","category":"external_commands","line_end":51,"severity":"medium","line_start":45},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","file":"SKILL.md","pattern":"Ruby/shell backtick execution","snippet":"```","category":"external_commands","line_end":55,"severity":"medium","line_start":51},{"id":"network:SKILL.md:19:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"export CODEX_BARK_KEY=\"\" # https://api.day.app/<CODEX_BARK_KEY>/","category":"network","line_end":19,"severity":"low","line_start":19},{"id":"network:SKILL.md:20:hardcoded-url","file":"SKILL.md","pattern":"Hardcoded URL","snippet":"export CODEX_BARK_BASE_URL=\"https://api.day.app\"","category":"network","line_end":20,"severity":"low","line_start":20},{"id":"filesystem:SKILL.md:47:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"--task-title \\\"...\\\" \\","category":"filesystem","line_end":47,"severity":"high","line_start":47},{"id":"filesystem:SKILL.md:49:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"--summary \\\"...\\\" \\","category":"filesystem","line_end":49,"severity":"high","line_start":49},{"id":"filesystem:SKILL.md:50:path-traversal-sequence","file":"SKILL.md","pattern":"Path traversal sequence","snippet":"--project-name \\\"...\\\"","category":"filesystem","line_end":50,"severity":"high","line_start":50},{"id":"filesystem:SKILL.md:16:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"You can add the following lines to `~/.bashrc` (Linux) or `~/.zshrc` (macOS) to set environment vari","category":"filesystem","line_end":16,"severity":"high","line_start":16},{"id":"filesystem:SKILL.md:46:hidden-file-in-home-directory","file":"SKILL.md","pattern":"Hidden file in home directory","snippet":"python3 ~/.codex/skills/bark-notify/scripts/send_bark_notification.py \\","category":"filesystem","line_end":46,"severity":"high","line_start":46},{"id":"filesystem:SKILL.md:16:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"You can add the following lines to `~/.bashrc` (Linux) or `~/.zshrc` (macOS) to set environment vari","category":"filesystem","line_end":16,"severity":"medium","line_start":16},{"id":"filesystem:SKILL.md:46:hidden-file-access","file":"SKILL.md","pattern":"Hidden file access","snippet":"python3 ~/.codex/skills/bark-notify/scripts/send_bark_notification.py \\","category":"filesystem","line_end":46,"severity":"medium","line_start":46},{"id":"blocker:SKILL.md:41:system-reconnaissance","file":"SKILL.md","pattern":"System reconnaissance","snippet":"- Write a brief result summary; avoid secrets.","category":"blocker","line_end":41,"severity":"low","line_start":41}],"finding_verdicts":[{"id":"network:scripts/send_bark_notification.py:88:hardcoded-url","reason":"The helper defaults to https://api.day.app and later posts task notification data to that endpoint. This is expected for Bark, but it is intentional outbound network behavior.","verdict":"confirmed","severity":"low","confidence":0.82},{"id":"env_access:scripts/send_bark_notification.py:86:python-environment-access","reason":"The machine name is read from the environment and included in the notification body sent externally. It is not a secret, but it can identify the user device.","verdict":"confirmed","severity":"low","confidence":0.74},{"id":"env_access:scripts/send_bark_notification.py:87:python-environment-access","reason":"CODEX_BARK_KEY is a Bark credential used in the request URL. Reading it is required, but mishandling can disclose a notification token.","verdict":"confirmed","severity":"low","confidence":0.88},{"id":"env_access:scripts/send_bark_notification.py:88:python-environment-access","reason":"CODEX_BARK_BASE_URL controls the outbound notification destination. This is legitimate configuration, but it can redirect posted task data if set incorrectly.","verdict":"confirmed","severity":"low","confidence":0.7},{"id":"external_commands:SKILL.md:16:ruby-shell-backtick-execution","reason":"Line 16 contains markdown inline code for shell profile file names. It does not execute Ruby, shell backticks, or any command.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:17:ruby-shell-backtick-execution","reason":"The reported range is a markdown code fence showing environment variable exports for manual setup. It is documentation, not automatic command execution by the skill.","verdict":"false_positive","confidence":0.92},{"id":"external_commands:SKILL.md:21:ruby-shell-backtick-execution","reason":"Line 21 is the closing markdown fence for the environment variable example. It is not executable code.","verdict":"false_positive","confidence":0.95},{"id":"external_commands:SKILL.md:32:ruby-shell-backtick-execution","reason":"Line 32 describes AGENTS.md as a documentation file using inline code formatting. There is no shell execution pattern on this line.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:33:ruby-shell-backtick-execution","reason":"Line 33 shows frontmatter key names in markdown backticks. These are literal examples and not commands.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:34:ruby-shell-backtick-execution","reason":"Line 34 shows project name text examples in markdown backticks. It does not invoke a shell or external process.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:40:ruby-shell-backtick-execution","reason":"Line 40 lists allowed status words using inline code formatting. These values are not commands.","verdict":"false_positive","confidence":0.96},{"id":"external_commands:SKILL.md:45:ruby-shell-backtick-execution","reason":"The markdown block instructs the agent to run python3 against the bundled helper script. This external command is expected, but generated arguments require careful quoting.","verdict":"confirmed","severity":"medium","confidence":0.84},{"id":"external_commands:SKILL.md:51:ruby-shell-backtick-execution","reason":"Line 51 is the closing markdown fence for the command example. It is not a separate command or shell backtick execution.","verdict":"false_positive","confidence":0.94},{"id":"network:SKILL.md:19:hardcoded-url","reason":"The documentation shows the Bark API URL used with the notification key. It reflects the skill's intended external service, which users should understand before enabling.","verdict":"confirmed","severity":"low","confidence":0.72},{"id":"network:SKILL.md:20:hardcoded-url","reason":"The setup example configures https://api.day.app as the notification endpoint. This is expected, but confirms the skill depends on an external network service.","verdict":"confirmed","severity":"low","confidence":0.75},{"id":"filesystem:SKILL.md:47:path-traversal-sequence","reason":"The snippet contains an ellipsis placeholder for --task-title, not a ../ path traversal sequence. It does not reference filesystem traversal.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:49:path-traversal-sequence","reason":"The snippet contains an ellipsis placeholder for --summary, not a path traversal operation. It is part of a command example.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:50:path-traversal-sequence","reason":"The --project-name placeholder uses three dots as omitted text. There is no filesystem path traversal instruction or code.","verdict":"false_positive","confidence":0.98},{"id":"filesystem:SKILL.md:16:hidden-file-in-home-directory","reason":"The line mentions ~/.bashrc and ~/.zshrc as manual user configuration targets. The skill code does not write to those hidden files.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:SKILL.md:46:hidden-file-in-home-directory","reason":"The path under ~/.codex/skills is the standard installed skill location in the documentation. It is not hidden file access for persistence or stealth.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:SKILL.md:16:hidden-file-access","reason":"This is the same manual shell profile setup text and no automatic read or write occurs. The pattern is documentation-only.","verdict":"false_positive","confidence":0.9},{"id":"filesystem:SKILL.md:46:hidden-file-access","reason":"The documented ~/.codex path points to the installed helper script. It is expected skill usage, not suspicious hidden file access.","verdict":"false_positive","confidence":0.9},{"id":"blocker:SKILL.md:41:system-reconnaissance","reason":"Line 41 tells users to avoid secrets in the notification summary. This is safety guidance, not system reconnaissance.","verdict":"false_positive","confidence":0.97}],"semantic_findings":[{"title":"Dry-run Output Can Disclose Bark Key","severity":"medium","locations":[{"file":"scripts/send_bark_notification.py","line_end":122,"line_start":118}],"confidence":0.9,"description":"The helper builds the request URL with CODEX_BARK_KEY and prints that full URL during dry-run mode. Logs or copied output can expose the notification token.","confidence_reasoning":"Line 118 embeds the Bark key in the URL, and line 122 prints that URL during dry-run. This is direct credential exposure to local output."},{"title":"Task Metadata Is Sent To External Push Service","severity":"medium","locations":[{"file":"scripts/send_bark_notification.py","line_end":119,"line_start":109},{"file":"scripts/send_bark_notification.py","line_end":130,"line_start":127}],"confidence":0.86,"description":"The notification body includes device, project, status, and summary fields before posting to Bark. Sensitive project details can leave the local environment if summaries are too broad.","confidence_reasoning":"The code constructs a payload from task metadata and sends it with urllib. This is intended behavior, but the privacy risk is clear from the data fields."}],"subject_marketplace_commit_sha":null,"subject_content_hash":null,"subject_tree_hash":null,"subject_plugin_path":null,"audit_payload_hash":null,"confirmed_risk_level":null,"scanner_version":null,"policy_version":null,"subject":{"marketplaceCommitSha":null,"contentHash":null,"treeHash":null,"pluginPath":null,"auditPayloadHash":null},"scannerVersion":null,"policyVersion":null},"auditTranslation":null,"localization":{"requestedLocale":"en","contentLocale":"en","availableLocales":["en"],"fallbackToEnglish":false},"attestation":{"availability":"not_attestable","url":null,"status":null,"reason":"confirmed_risk_level does not match the canonical trust resolver"},"trust":{"publicState":"public","auditState":"complete","auditCurrentness":null,"confirmedRiskLevel":"medium","confirmedFindingCount":2,"capabilityReviewCount":7,"needsReviewCount":0,"falsePositiveCount":0,"agentAutoInstallPolicy":"allowed","manualInstallPolicy":"allowed","artifactSignatureState":"available","attestationState":"not_attestable","verificationState":"not_verified"},"isLatest":false}}