// npm 패키지
@adminforth/dashboard
Dashboard plugin for AdminForth
버전
16
메인테이너
6
라이선스
MIT
최초 publish
2026-05-28
publisher
vanbrosh
tarball
1,510,351 B
AUTO-PUBLISHED·1개 버전 인덱싱됨·최근 publish: 2026-06-05
// exfil path
what is read → where it shipssteals
- ● Slack tokens
sends to
(no destination string extracted — payload may be dynamic / obfuscated)
evidence in excerpt
> curl -s -X POST -H "Content-Type: application/json" -d '{
> }' "$DEVELOPERS_SLACK_WEBHOOK"
> curl -sS -X POST -H "Content-Type: application/json" -d '{
> }' "$DEVELOPERS_SLACK_WEBHOOK" 2>&1
> "homepage": "https://adminforth.dev/docs/tutorial/Plugins/dashboard/",// publisher 캠페인by vanbrosh
이 계정에서 catch된 패키지 4건고립된 catch가 아닙니다. 동일 publisher가 3개의 다른 패키지를 추가로 발행했고, 모두 파이프라인이 catch했습니다 — 일회성이 아닌 조직적 캠페인의 형태. 아래 링크는 각 형제 catch의 분석으로 이동합니다.
// offending code· @1.11.2· 1 file flagged
- @1.11.2··AUTO-PUBLISHED·publisher: vanbroshheuristic 64/100static flags 1llm skippednew-publisher:16dmature-packagepublisher-multi-name-burst:5publisher-version-pump:7reads-slack-tokens
// offending code· 1 file flaggedpatterns: 1
--- package/.woodpecker/buildSlackNotify.sh (excerpt) --- #!/bin/sh set -x COMMIT_SHORT_SHA=$(echo $CI_COMMIT_SHA | cut -c1-8) STATUS=${1} if [ "$STATUS" = "success" ]; then MESSAGE="Did a build without issues on \`$CI_REPO_NAME/$CI_COMMIT_BRANCH\`. Commit: _${CI_COMMIT_MESSAGE}_ (<$CI_COMMIT_URL|$COMMIT_SHORT_SHA>)" curl -s -X POST -H "Content-Type: application/json" -d '{ "username": "'"$CI_COMMIT_AUTHOR"'", "icon_url": "'"$CI_COMMIT_AUTHOR_AVATAR"'", "attachments": [ { "mrkdwn_in": ["text", "pretext"], "color": "#36a64f", "text": "'"$MESSAGE"'" } ] }' "$DEVELOPERS_SLACK_WEBHOOK" exit 0 fi export BUILD_LOG=$(cat ./build.log) BUILD_LOG=$(echo $BUILD_LOG | sed 's/"/\\"/g') MESSAGE="Broke \`$CI_REPO_NAME/$CI_COMMIT_BRANCH\` with commit _${CI_COMMIT_MESSAGE}_ (<$CI_COMMIT_URL|$COMMIT_SHORT_SHA>)" CODE_BLOCK="\`\`\`$BUILD_LOG\n\`\`\`" echo "Sending slack message to developers $MESSAGE" # Send the message curl -sS -X POST -H "Content-Type: application/json" -d '{ "username": "'"$CI_COMMIT_AUTHOR"'", "icon_url": "'"$CI_COMMIT_AUTHOR_AVATAR"'", "attachments": [ { "mrkdwn_in": ["text", "pretext"], "color": "#8A1C12", "text": "'"$CODE_BLOCK"'", "pretext": "'"$MESSAGE"'" } ] }' "$DEVELOPERS_SLACK_WEBHOOK" 2>&1 --- package.json (entry) --- { "name": "@adminforth/dashboard", "version": "1.11.2", "main": "dist/index.js", "types": "dist/index.d.ts", "type": "module", "homepage": "https://adminforth.dev/docs/tutorial/Plugins/dashboard/", "publishConfig": { "access": "public" }, "scripts": { "build": "rm -rf dist && tsc && rsync -av --exclude 'node_modules' custom dist/", "typecheck": "tsc --noEmit" }, "keywords": [ "adminforth", "dashboard" ], "author": "DevForth (https://devforth.io)", "license": "MIT", "description": "Dashboard plugin for AdminForth", "devDependencies": { "@types/node": "latest", "adminforth": "2.61.0-next.9", "semantic-release": "^24.2.1", "semantic-release-slack-bot": "^4.0.2", "typescript": "^5.7.3", "vue-tsc": "^3.3.2" }, "peerDependencies": { "adminforth": "^2.60.0" }, "release": { "plugins": [ "@semantic-release/commit-analyzer", "@semantic-release/release-notes-generator", "@semantic-release/npm", "@semantic-release/github", [ "semantic-release-slack-bot", { "packageName": "@adminforth/dashboard", "notifyOnSuccess": true, "notifyO --- index.js (entry) --- var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { AdminForthPlugin } from "adminforth"; import { randomUUID } from 'crypto'; import path from 'path'; import { registerDashboardEndpoints } from './endpoint/dashboard.js'; import { registerGroupEndpoints } from "./endpoint/groups.js"; import { registerWidgetEndpoints } from './endpoint/widgets.js'; import { createDashboardConfigService } from "./services/dashboardConfigService.js"; import { createWidgetDataService } from "./services/widgetDataService.js"; const DEFAULT_DASHBOARD_CONFIG = { version: 1,
