扫描报告
15 /100
alista
Save restaurants, bars, and cafes from TikTok and Instagram videos. Search saved places and get weekend suggestions.
A legitimate restaurant bookmark manager with well-scoped filesystem and network access; no malicious patterns found. The hardcoded IP flagged in pre-scan is a false positive (Chrome UA string fragment, not a C2 IP).
可以安装
No blocking action needed. Consider pinning better-sqlite3 and date-fns versions in package.json for supply-chain hygiene.
安全发现 2 项
| 严重性 | 安全发现 | 位置 |
|---|---|---|
| 低危 | Runtime dependencies use unpinned version ranges 供应链 | package.json:11 |
| 低危 | shell:WRITE capability not declared in metadata block 文档欺骗 | scripts/fetch-post.ts:84 |
| 资源类型 | 声明权限 | 推断权限 | 状态 | 证据 |
|---|---|---|---|---|
| 文件系统 | WRITE | WRITE | ✓ 一致 | db.ts:reads migrations from __dirname; getDb():creates/opens alista.db |
| 网络访问 | READ | READ | ✓ 一致 | metadata-fetcher.ts:apify.com, instagram.com, tiktok.com; place-verifier.ts:plac… |
| 命令执行 | NONE | WRITE | ✓ 一致 | fetch-post.ts:84-89: execFileSync('ffmpeg'/'ffprobe') — necessary for video fram… |
2 高危 12 项发现
高危 API 密钥 疑似硬编码凭证
API_KEY="your-google-places-key" README.md:41 高危 IP 地址 硬编码 IP 地址
120.0.0.0 scripts/lib/metadata-fetcher.ts:204 中危 外部 URL 外部 URL
https://console.cloud.google.com/apis/library/places-backend.googleapis.com README.md:48 中危 外部 URL 外部 URL
https://console.apify.com/ README.md:49 中危 外部 URL 外部 URL
https://www.instagram.com/reel/ABC123/ README.md:60 中危 外部 URL 外部 URL
https://opencollective.com/biome package-lock.json:92 中危 外部 URL 外部 URL
https://www.patreon.com/feross package-lock.json:204 中危 外部 URL 外部 URL
https://feross.org/support package-lock.json:208 中危 外部 URL 外部 URL
https://api.apify.com/v2/acts/$ scripts/lib/metadata-fetcher.ts:47 中危 外部 URL 外部 URL
https://www.instagram.com/$ scripts/lib/metadata-fetcher.ts:53 中危 外部 URL 外部 URL
https://www.tiktok.com/oembed?url=$ scripts/lib/metadata-fetcher.ts:326 中危 外部 URL 外部 URL
https://api.example.com/data scripts/lib/utils/circuit-breaker.ts:35 目录结构
22 文件 · 108.9 KB · 3955 行 TypeScript 16f · 2965L
JSON 3f · 663L
Markdown 2f · 258L
SQL 1f · 69L
├─
▾
migrations
│ └─
001-initial.sql
SQL
├─
▾
scripts
│ ├─
▾
lib
│ │ ├─
▾
utils
│ │ │ ├─
circuit-breaker.ts
TypeScript
│ │ │ ├─
html.ts
TypeScript
│ │ │ ├─
index.ts
TypeScript
│ │ │ ├─
retry.ts
TypeScript
│ │ │ ├─
text.ts
TypeScript
│ │ │ └─
url-normalizer.ts
TypeScript
│ │ ├─
db.ts
TypeScript
│ │ ├─
metadata-fetcher.ts
TypeScript
│ │ ├─
nudge-scorer.ts
TypeScript
│ │ ├─
place-verifier.ts
TypeScript
│ │ └─
types.ts
TypeScript
│ ├─
fetch-post.ts
TypeScript
│ ├─
lookup-place.ts
TypeScript
│ ├─
nudge.ts
TypeScript
│ ├─
save-place.ts
TypeScript
│ └─
search-places.ts
TypeScript
├─
package-lock.json
JSON
├─
package.json
JSON
├─
README.md
Markdown
├─
SKILL.md
Markdown
└─
tsconfig.json
JSON
依赖分析 4 项
| 包名 | 版本 | 来源 | 已知漏洞 | 备注 |
|---|---|---|---|---|
better-sqlite3 | ^11.0.0 | npm | 否 | Version not pinned — recommend exact pin |
date-fns | ^4.1.0 | npm | 否 | Version not pinned |
date-fns-tz | ^3.2.0 | npm | 否 | Version not pinned |
zod | ^3.23.0 | npm | 否 | Version not pinned |
安全亮点
✓ No credential harvesting — API keys are read from env vars and used only for their intended APIs
✓ No sensitive path access (no ~/.ssh, ~/.aws, .env file reads)
✓ No base64, eval, or obfuscation patterns
✓ No data exfiltration — all network calls go to declared, legitimate endpoints (Google Places, Apify, Instagram, TikTok CDN)
✓ No reverse shell, C2, or persistence mechanisms
✓ Image/video downloads are restricted to whitelisted CDN hostnames (cdninstagram.com, tiktokcdn.com, fbcdn.net, akamaized.net)
✓ Download and frame-extraction directories are sandboxed to CWD (path traversal check in fetch-post.ts)
✓ SQLite DB is local-only with WAL mode and foreign keys enforced
✓ Circuit breaker pattern protects against cascading API failures
✓ API keys are environment-variable-only, never hardcoded in source