Commit Graph

1529 Commits

Author SHA1 Message Date
dd18e5c4aa fix(repo): Fix BusyBox ash compatibility in repo-sync
Wrap for loop with output redirection in subshell for
BusyBox ash compatibility when generating Packages index.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 16:43:27 +01:00
a15cdfc823 fix(ci): Sync GHA build workflow with local-build.sh methodology
- Split builds into SDK (PKGARCH:=all) and Toolchain (native binaries)
- Mirror OPENWRT_ONLY_PACKAGES list from local-build.sh
- Add all architectures: x86-64, aarch64-cortex-a72, aarch64-cortex-a53,
  aarch64-generic, rockchip-armv8, mips-24kc, mipsel-24kc
- SDK builds: LuCI apps, shell scripts, configs
- Toolchain builds: Go (crowdsec), C++ (netifyd, ndpid)
- Combine artifacts per architecture with checksums
- Create GitHub releases on tags

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:59:05 +01:00
21a8f06058 chore(secubox-app-bonus): Rebuild local feed with repo packages
- Add secubox-app-repo and luci-app-repo to local feed
- Regenerate Packages index
- Update all embedded packages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:54:11 +01:00
6d2ee8ae8f fix(repo-sync): Fix shell syntax error in for loop
Remove invalid 2>/dev/null redirection from for loop header

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:33:06 +01:00
86d6889285 fix(repo): Add usign package signing and fix ACL conflict
- Add usign dependency for package signing
- Sign Packages files after generation in repo-sync
- Generate signing keys automatically if not present
- Remove duplicate ACL file (now only in luci-app-repo)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 12:29:48 +01:00
088b6e749f fix(luci-app-repo): Add proper Package definition with TITLE field
- Add Package/luci-app-repo section with required fields
- Add Build/Compile empty target
- Add package description
- Fix build failure in SDK

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:41:36 +01:00
c152934bf1 fix(repo): Add postinst script to configure opkg feeds automatically
- Auto-create repo directories on install
- Detect device architecture and configure customfeeds.conf
- Add prerm script to cleanup on uninstall
- Points opkg to local repo at 192.168.255.1:8888

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:33:50 +01:00
9cd59b77ba feat(repo): Add secubox-app-repo and luci-app-repo packages
Backend package (secubox-app-repo):
- repoctl CLI for managing local package repository
- repo-sync script to download packages from GitHub releases
- uhttpd-based server on port 8888
- UCI configuration at /etc/config/repo
- RPCD handler for LuCI integration
- Auto-sync cron support (configurable interval)

Frontend package (luci-app-repo):
- Dashboard showing repository status and package counts
- Sync button to trigger package downloads
- Log viewer for sync operations
- Usage instructions for opkg configuration

Supported architectures:
- x86_64, aarch64_cortex-a72, aarch64_generic
- mips_24kc, mipsel_24kc

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 10:21:23 +01:00
276685f109 feat(repo): Add package repository at repo.secubox.in
- Fix preseed URLs from non-existent repo.secubox.org to repo.secubox.in
- Make feed URLs architecture-aware (x86_64, aarch64_cortex-a72, etc.)
- Add publish-package-repo.yml workflow for GitHub Pages deployment
- Workflow downloads release artifacts, generates opkg Packages index
- Supports all SecuBox architectures with proper opkg feed structure

Package repository structure:
- https://repo.secubox.in/packages/{arch}/ - Core SecuBox packages
- https://repo.secubox.in/luci/{arch}/ - LuCI apps
- https://repo.secubox.in/catalog/ - Repository metadata

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-18 09:10:01 +01:00
89e6db8631 chore(vm): Disable ARM64 Generic target (package repo issues) 2026-03-18 08:35:29 +01:00
19ee3b761d fix(vm): Use matrix target path for ARM image listing 2026-03-18 08:09:31 +01:00
eb46c7128b fix(vm): Fix ARM builds by using arch-specific packages
- Remove docker/bind-server from ARM (not available)
- Use simpler package set for ARM targets
- Fix rockchip profile name
- Keep x86-64 with full package set

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 21:17:46 +01:00
9c4d8dcdfd feat(vm): Add ARM64 architectures to C3Box VM builds
- Add aarch64-generic (QEMU/Proxmox ARM)
- Add Raspberry Pi 4/400/CM4 (bcm27xx/bcm2711)
- Add Rockchip ARM64 (NanoPi R4S/R5S/R6S)
- Download arch-specific prebuilt packages
- Add architecture-specific kernel modules
- Create local build script with same logic
- Handle different image formats per arch

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 20:44:40 +01:00
2c2d11423c feat(vm): Include full SecuBox package suite in C3Box VM
- Download prebuilt packages from release artifacts
- Include 101+ SecuBox modules matching c3box.local production
- Preseed SecuBox core config (appstore, security, diagnostics)
- Configure network: 192.168.200.1 (LAN), DHCP (WAN)
- Include master-link mesh and P2P hub components
- Add fallback install script for post-boot installation
- Increase default disk to 8GB for full suite
- Update RAM recommendation to 2GB minimum

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 20:05:40 +01:00
2482f76e52 fix(ci): Use explicit version input for C3Box VM naming
- Add 'version' input parameter (default: v1.0.0-beta)
- Use C3BOX_VERSION env var for consistent naming
- Artifacts now named: c3box-vm-{version}-{arch}.{format}
- Fix: manual triggers now use correct version in filenames

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 19:36:16 +01:00
5da21f29e4 feat(ci): Update C3Box preseed for devel/beta test config
- LAN IP changed to 192.168.200.1 (test subnet)
- WAN (br-wan) configured as DHCP client
- Updated banner, docs, and release notes with new IP
- Ready for SecuBox devel beta testing

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 19:12:08 +01:00
4fa322d1fd feat(ci): Rebrand VM appliance to C3Box
- Rename workflow to "Build C3Box VM Appliance"
- Update hostname to 'c3box'
- New ASCII banner with C3Box branding
- Update artifact names: c3box-vm-{version}-{arch}
- Update all documentation and release notes
- Config files now in /etc/c3box/

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 18:54:46 +01:00
d8f8d04110 fix(ci): Look for SecuBox packages in package/secubox/
The luci-app-* packages are in package/secubox/, not at the repo root.
Updated the workflow to copy packages from the correct location.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 18:02:04 +01:00
4b72126784 fix(ci): Handle gunzip trailing garbage warning in VM build
OpenWrt firmware images contain trailing data that gunzip reports
as "trailing garbage" with exit code 2. This is normal and the
extracted image is valid. The fix ignores the warning while still
checking that extraction produced output.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 17:47:36 +01:00
b2af68ac9a feat(ci): Add multi-platform firmware and VM appliance workflows
New workflows using OpenWrt Image Builder for fast builds:

build-firmware-imagebuilder.yml:
- 16+ devices: x86-64, RPi 3/4/5, NanoPi R4S/R5S/R6S, GL.iNet, Linksys, NETGEAR, Ubiquiti, GlobalScale
- Uses Image Builder (much faster than source compilation)
- Pre-installs SecuBox packages
- Preseed auto-configuration
- Configurable root filesystem size (256MB-2GB)

build-vm-appliance.yml:
- VM images in multiple formats: VMDK, VDI, QCOW2
- EFI and BIOS boot options
- Auto-resize filesystem on first boot
- Configurable disk size (1-8GB)
- Ready for VMware, VirtualBox, Proxmox

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 17:34:26 +01:00
5b3ee567c5 feat(ci): Add x86_64 VM firmware build workflow
- New build-secubox-vm.yml for ready-to-use SecuBox VM images
- Uses OpenWrt 24.10.5 (latest stable release)
- Builds VMDK, VDI, QCOW2 formats for all VM platforms
- Includes all SecuBox LuCI packages pre-installed
- Docker support enabled (dockerd, docker-compose)
- Virtio drivers and QEMU guest tools for KVM/Proxmox
- Configurable rootfs size (512MB-4GB)
- Manual dispatch + automatic on version tags

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 14:00:34 +01:00
1edb8c880c fix(ci): Handle luci.mk auto-generated PKG_NAME
- luci.mk auto-sets PKG_NAME from directory name
- Skip PKG_NAME check for packages using luci.mk
- PKG_VERSION/PKG_RELEASE are recommended for luci.mk packages
- PKG_LICENSE remains recommended for all packages

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 13:00:34 +01:00
49a6090dcf fix(ci): Make PKG_LICENSE warning instead of error
- PKG_LICENSE is now recommended, not required
- Required: PKG_NAME, PKG_VERSION, PKG_RELEASE
- Warnings are reported but don't fail the build
- Also updated tracking docs

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:48:12 +01:00
cb59c58617 docs: Update tracking for Metrics Dashboard v2 + caching
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:43:48 +01:00
a53d2b1d63 fix(metrics): Get WAF blocked count from CrowdSec mitmproxy decisions
- WAF blocked now counts mitmproxy scenario decisions (1031 blocks)
- Removed waf_threats field (redundant with waf_blocked)
- Fixed dashboard to show 3 WAF stats: Bans, Alerts, Blocked

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:41:14 +01:00
9263fd7e4b feat(metrics): KISS-styled dashboard with double-buffer caching
UI:
- Clean card grid with colored stat values
- Services status bar (HAProxy, WAF, CrowdSec) with glowing dots
- Two-panel layout for WAF/Security and Connections
- Live clock with pulsing indicator
- Proper KissTheme.wrap() integration

Performance:
- Double-buffer cache at /tmp/secubox/metrics-cache.json
- 30s TTL with async background refresh
- Cron job for periodic cache updates
- Instant RPCD response (no computation on request)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 12:37:57 +01:00
0a2b65b913 docs: Update tracking files for Metrics Dashboard + WAF hot-reload
- Added LuCI Metrics Dashboard to HISTORY.md
- Documented WAF hot-reload discovery
- Updated WIP.md with completed work
- Noted HAProxy health check fix and test site cleanup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 11:59:17 +01:00
f25854b08b fix(metablogizer): Use mitmproxy hot-reload instead of restart
mitmproxy's haproxy_router.py addon already implements hot-reload:
- Checks routes file mtime on every request
- Auto-reloads when file changes

Removed unnecessary mitmproxy restart after adding routes.
Just ensure file permissions are correct (644) for hot-reload to work.

This makes publishing faster and avoids service disruption.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 11:56:11 +01:00
678e5a5921 feat(luci): Add Metrics Dashboard + fix WAF filters layout
New luci-app-metrics-dashboard with real-time system overview:
- System uptime, memory, load stats
- Core services status (HAProxy, mitmproxy, CrowdSec)
- vHosts, MetaBlog sites, Streamlit apps counts
- WAF alerts, bans, threats statistics
- Active connections (HTTP, HTTPS, SSH, TCP total)
- SSL certificates list
- Auto-refresh every 5 seconds

WAF Filters page:
- Changed stats display to single-line compact format
- Shows "17 Categories · 17 Active · 150 Rules" inline

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 11:54:37 +01:00
8e55757dee fix(metablogizer): Auto-restart mitmproxy after adding routes
- Add mitmproxy restart after _add_mitmproxy_route() to load new routes
- mitmproxy loads routes at startup only, so restart is required
- Run restart in background to avoid blocking publish command

Also fixed on router:
- Disabled health check for mitmproxy_inspector backend
- HAProxy health check fails because mitmproxy returns 404 for
  requests without valid Host header

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 11:46:53 +01:00
3127986fbc docs: Update tracking files for HAProxy/mitmproxy WAF routing fix
- Fixed 503 errors on published sites (testsite, santefr, etc.)
- Root cause: mitmproxy haproxy_router_enabled missing from UCI
- Root cause: mitmproxy routes not reloaded after file update
- Root cause: HAProxy config needed reload after changes

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 10:56:14 +01:00
c8a5e1c19a fix(metablogizer): Route new sites through mitmproxy for WAF inspection
- Changed vhost backend from direct metablog_* to mitmproxy_inspector
- Added original_backend tracking for mitmproxy route resolution
- Changed server address from 192.168.255.1 to 127.0.0.1
- Added _add_mitmproxy_route helper for route registration
- Fixed both cmd_publish() and _emancipate_haproxy() functions

This ensures all newly published sites go through WAF inspection
rather than bypassing security checks.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 10:35:26 +01:00
e1f2a0e885 feat(droplet): Implement async publish to prevent UI timeout
- RPCD handler returns immediately with job_id (~0.04s)
- Background script uses file output to avoid pipe inheritance issues
- LuCI JS polls job_status every 2s until completion
- Uses setsid for proper process detachment
- jsonfilter for reliable parameter parsing

Fixes "Failed to publish" error caused by ubus timeout during
40+ second publish operations.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 09:43:19 +01:00
ddf480e6ed fix(droplet,dpi): Resolve publish hang and broken pipe errors
- dropletctl: Remove pipe to grep that blocked on background children
- metablogizerctl: Background HAProxy generate/reload (~90s with 95 certs)
- dpi-lan-collector: Pre-compute flow counts in single pass instead of
  spawning grep per client (eliminates broken pipe errors)

Publish time reduced from ~2 min to ~35 seconds.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 07:39:09 +01:00
ece237d194 feat(mitmproxy): Add headless mode to reduce RAM from 3.4GB to 96MB
- Add headless UCI option to use mitmdump instead of mitmweb
- Enable headless by default for WAF (mitmproxy-in) instance
- Increase default memory limit from 256MB to 2GB
- Fix LXC config generation to always recreate on service start
- Fix rootfs check path (/usr/local/bin not /usr/bin)
- Use exec in startup script for proper foreground execution

Headless mode runs mitmdump (CLI) instead of mitmweb (web UI),
saving ~3.3GB RAM while maintaining full WAF functionality.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-17 07:14:05 +01:00
3fcad8e626 fix(waf): Prevent false positive bot detection on legitimate browsers
- Add LEGITIMATE_BROWSERS whitelist (Chrome, Firefox, Safari, Edge, etc.)
- Check for legitimate browser signatures BEFORE bot signature matching
- Fix CriOS (Chrome iOS) false positive: 'mozi' substring matched Mozi botnet
- Make botnet signatures more specific: 'mozi' → 'mozi/', 'mozi '
- Prevents banning real users loading pages with multiple JS requests

Fixes false positive on IP 82.65.224.119 (French ISP, Chrome iOS user)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 19:30:02 +01:00
a0825c73c1 feat(waf): Add honeypot detection categories and fix JSON escapes
- Fix invalid \x00 JSON escapes to valid \u0000 Unicode escapes
- Add 4 new WAF rule categories:
  - waf_fingerprint (12 rules): WAF bypass/fingerprinting detection
  - honeypot (16 rules): Decoy file and admin panel probes
  - recon_crawler (10 rules): Reconnaissance file enumeration
  - credential_harvest (8 rules): Password/token exposure detection
- Total: 17 categories, 150 rules
- UI: Inline stats header layout for WAF Filters page

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 09:52:43 +01:00
f46e145927 feat(crowdsec): Add geo heatmap visualization for threat origins
- New heatmap.js component with SVG world map and country centroids
- Colored dots show threat distribution: orange (local), cyan (CAPI), red (WAF)
- Dot size scales logarithmically with threat count (4-20px)
- Hover tooltips show country code and count
- Added geo_local_raw and geo_capi_raw fields to RPCD backend
- CAPI geo extraction from decisions with GeoIP metadata
- CSS styling for heatmap container, dots, and legend

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 09:28:48 +01:00
b02503eac4 fix(crowdsec): Count all mitmproxy scenarios in WAF bans
Changed waf_bans_today to count all mitmproxy-* scenarios instead of
only mitmproxy-waf (which doesn't exist). Now correctly counts
mitmproxy-scanner, mitmproxy-botscan, etc.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 09:13:14 +01:00
f424ec72c1 fix(crowdsec): Fix rpcd blocking and show active bans
- Make refresh_cache async to prevent rpcd watchdog kills
- Fix JSON escaping for top_scenarios/countries arrays
- Show decisions as "Active Bans" when alerts_raw is empty
- Display ban expiry time instead of creation time
- Update cron to run cache refresh in background

Fixes LuCI crashes caused by 16s blocking refresh calls.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 08:35:03 +01:00
b9f789fdb7 fix(crowdsec): Fix alerts/scenarios/countries stats in dashboard
- alerts_24h now uses local_decisions count instead of empty file
- top_scenarios_raw now extracts from decisions JSON (was parsing CAPI metrics)
- top_countries_raw now correctly parses IsoCode from alerts GeoIP metadata
- Double-buffer caching via cron job already in place

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 08:29:59 +01:00
c74ba2e474 feat(luci): KISS theme rework for SMTP Relay and SecuBox Users
- Rewrite smtp-relay/settings.js with proper KISS theme styling
- Rewrite secubox-users/overview.js with proper KISS theme styling
- Use KissTheme.wrap() for consistent dark theme rendering
- Add stat cards with colored values matching mailserver reference
- Add proper form styling with inline CSS variables
- Add NZB tools (SABnzbd, NZBHydra) to KISS menu Downloads
- Add webtorrent to portal tree Downloads category
- Fix portal tree webtorrent pattern

KISS = Keep It Simple Sexy

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 08:20:12 +01:00
ee7cd8ef6f fix(lyrion): Fix Rescan button disabled state in updateUI
The updateUI function was incorrectly disabling the Rescan button when
Lyrion was running. Rescan should only be enabled when running.

- Split forEach into separate button handlers
- Start button: disabled when running (correct)
- Rescan button: disabled when NOT running (fixed)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 07:56:09 +01:00
d0cd42e2a1 fix(luci): Performance and UX improvements for exposure and portal
- Optimize exposure RPCD: O(n) single-pass awk parsing for vhost_list
  and ssl_list (fixes XHR timeout on 200+ vhosts)
- Fix portal tree URLs: Use get_menu_path() to read actual LuCI menu
  paths from JSON instead of hardcoded paths
- Add Downloads category to portal tree (torrent, droplet patterns)
- Add new apps to System category (config-vault, reporter, smtp-relay,
  rtty, dpi-dual, metacatalog)
- Enhance KISS theme menu: Add Downloads, Monitoring categories
- Fix Lyrion URL: Use HTTPS vhost instead of dynamic port URL

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-16 07:35:18 +01:00
b08e71fa7f docs: Document quick-access QR page and port conflict fix
- Added quick-access.secubox.in QR landing page to tracking
- Documented MetaBlogizer port allocation race condition
- Existing tools: check-ports, fix-ports commands
- Fixed srvi/quick-access port 9013 conflict
- Updated mitmproxy routes (127.0.0.1 → 192.168.255.1)
- Added recommended improvements to backlog

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 19:46:30 +01:00
c59f7cde0b docs: Add quick-access page with QR codes
- QR codes for LuCI access (default, SecuBox router)
- QR codes for GitHub docs and release
- QR codes for Droplet and Streamlit Forge tools
- Default credentials display
- Dark theme matching SecuBox design

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 19:12:54 +01:00
2e772c1fa9 docs: Update project status for v1.0.0-beta release
- PROJECT-STATUS-AND-INNOVATION.md: Complete rewrite with current status
  - Four-layer architecture documentation
  - Punk Exposure three-channel model
  - All implemented innovations (AI Gateway, MCP, DPI, etc.)
  - Bug bounty scope and attack surface
  - VM distribution details

- README.md: Added default VM credentials

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 19:05:07 +01:00
b659c34d57 docs: Update HISTORY.md with v1.0.0 beta release
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 18:45:58 +01:00
605841e443 docs: v1.0.0 Beta Release - Pen Testing & Bug Bounty Ready
- BETA-RELEASE.md: Complete security testing guide
  - Attack surface overview (HAProxy, WAF, LXC, P2P)
  - High-value targets and secrets locations
  - Known weak points (intentional disclosure)
  - Bug bounty scope and reporting guidelines
  - Test environment setup (VirtualBox, Docker)

- SECURITY.md: Updated with Hall of Fame and beta info
- README.md: Version bump to 1.0.0-beta

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 18:45:29 +01:00
79775faa6e fix(luci): Add web UI URL link to Lyrion dashboard
- Move Web Interface section to top for visibility
- Always show Open Lyrion Web UI button with dynamic URL
- Display URL text next to button

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-03-15 18:39:03 +01:00