| version | 1.1.0 |
| name | security-code-auditor |
| description | Audit d.o.EPUB Studio code for vulnerabilities. Activate for auth, EPUB parsing, signed URL, or offline sync security reviews. Read-only analysis.
|
| category | quality |
| allowed-tools | Read Grep Glob |
| license | MIT |
Security Code Auditor
Perform security audits on d.o.EPUB Studio code, focusing on the project's specific security requirements.
d.o.EPUB Studio Security Scope
Critical Areas to Audit
- Authentication: Password hashing, session management, token generation
- Authorization: Permission grants, access validation, session revocation
- EPUB Handling: HTML sanitization, content extraction, file validation
- Signed URLs: Expiration, scope validation, URL generation
- Offline Sync: Conflict resolution, data integrity, cache security
Excluded from Scope
- Network penetration testing
- Social engineering
- Physical security
Audit Workflow
1. Identify Attack Surface
1. Authentication endpoints (/api/auth/*)
2. Book access endpoints (/api/books/*)
3. EPUB parsing (apps/web/lib/epub/)
4. Offline storage (IndexedDB, Service Workers)
2. Static Analysis Checklist
3. EPUB Security
element.innerHTML = epubContent;
import DOMPurify from 'isomorphic-dompurify';
const clean = DOMPurify.sanitize(epubContent, {
ALLOWED_TAGS: ['p', 'span', 'div', 'a'],
ALLOWED_ATTR: ['class', 'href']
});
4. Configuration Review
d.o.EPUB Studio Anti-Patterns
Hardcoded Secrets
const API_KEY = 'sk-live-abc123';
const API_KEY = process.env.EPUB_API_KEY;
Unsafe EPUB HTML
document.write(epubHtmlContent);
import sanitize from 'dompurify';
const safe = sanitize(rawContent, { RETURN_TRUSTED_TYPE: false });
Public File URLs
return `https://bucket.r2.dev/${bookId}`;
return generateSignedUrl(bookId, { expiresIn: '15m' });
Vulnerability Severity
| Level | Examples | Response |
|---|
| Critical | RCE, Auth bypass | Immediate fix |
| High | Data exposure, Privilege escalation | 24 hours |
| Medium | Information disclosure | 1 week |
| Low | Best practice | Next sprint |
Security Rules for d.o.EPUB Studio
- Never expose Turso auth tokens to frontend
- Always validate signed URLs server-side
- Sanitize all EPUB HTML content
- Validate EPUB file type/size on upload
- Log all permission changes
- Hash passwords with Argon2 or bcrypt
- Revoke sessions immediately on permission revocation
File-System Path Patterns
Codacy (via eslint-plugin-security) flags fs.* calls whose first
argument is non-literal — the OWASP path-traversal rule. Three patterns
to apply in this repo:
Read repo-static files
import { readFileSync } from 'node:fs';
readFileSync(new URL('./data.json', import.meta.url));
import data from './data.json';
import { readFileSync } from 'node:fs';
import path from 'path';
readFileSync(path.join(__dirname, 'data.json'), 'utf8');
Read user-supplied paths
const userPath = req.query.file;
readFileSync(`/var/data/${userPath}`);
import path from 'node:path';
const root = '/var/data';
const resolved = path.resolve(root, userPath);
if (!resolved.startsWith(root + path.sep)) {
throw new Error('Path escapes data root');
}
readFileSync(resolved);
The rule's intent is to block the first pattern. The second
pattern with path.resolve + startsWith guard is the 2026 best
practice from OWASP. Always prefer it over suppressing the rule.
References