Anso
3a22f59057
feat(security): surface Compose internet-reachability exposure in posture ( #1442 )
...
* feat(security): surface Compose internet-reachability exposure in posture
Builds a per-stack per-service exposure descriptor from the rendered
effective Compose model, cached at deploy/update time, and joins it into
the Security action posture. A service is publicly exposed when it
publishes a port on a non-loopback host IP or uses host networking.
The exposure cache lives in a new stack_exposure table, refreshed inside
ComposeService.deployStack and updateStack (covering all funneled paths:
manual, scheduler, mesh, templates, labels, App Store, Git, webhooks).
Cleanup runs on stack delete, blueprint withdrawal, and node delete.
The overview route intersects the exposed image set with the existing
per-image suppression-aware Critical/High tally, so a clean public
nginx does not escalate posture. The scan sheet shows a "Published
service" or "Internal only" evidence badge per image.
* fix(test): provide fresh auto-close proc for exposure spawn in stall tests
Two deployStack idle-stall tests used mockSpawn.mockReturnValue(proc)
which returned the same already-closed process for the new config spawn
added by the exposure refresh. The renderConfig promise hung waiting for
a close event that had already fired.
The fix uses mockImplementation to return the controlled proc for the
first spawn (up) and a fresh auto-closing proc for the second spawn
(config via refreshExposureCache).
* fix(security): tighten loopback detection, clarify exposure semantics, drop internal-only badge
- Expand isLoopback to cover full 127.0.0.0/8 range (127.0.0.2 etc)
- Clarify that exposure is configured (Compose model), not live topology
- Remove "Internal only" badge: false is not proof of non-exposure when
other stacks using the same image may lack a cached descriptor
2026-06-24 23:22:13 -04:00
..
2026-05-15 18:21:28 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-05-15 18:21:28 -04:00
2026-06-22 16:54:30 -04:00
2026-06-03 08:18:16 -04:00
2026-06-04 17:45:53 -04:00
2026-06-10 10:12:24 -04:00
2026-05-31 16:36:07 -04:00
2026-06-22 20:55:32 -04:00
2026-06-04 17:45:53 -04:00
2026-06-18 18:25:58 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-05-31 16:00:38 -04:00
2026-04-26 13:05:19 -04:00
2026-05-01 18:57:44 -04:00
2026-06-04 17:45:53 -04:00
2026-06-05 14:29:09 -04:00
2026-06-18 13:38:19 -04:00
2026-06-18 13:38:19 -04:00
2026-06-04 17:45:53 -04:00
2026-06-18 13:38:19 -04:00
2026-06-22 19:33:06 -04:00
2026-06-03 16:11:00 -04:00
2026-04-10 10:05:05 -04:00
2026-05-31 20:28:18 -04:00
2026-05-20 03:35:39 -04:00
2026-06-04 17:45:53 -04:00
2026-06-08 08:44:59 -04:00
2026-06-24 19:50:45 -04:00
2026-06-24 19:48:34 -04:00
2026-06-17 13:24:55 -04:00
2026-06-21 17:58:00 -04:00
2026-06-24 23:22:13 -04:00
2026-06-02 16:10:05 -04:00
2026-04-14 14:37:28 -04:00
2026-06-22 20:54:04 -04:00
2026-04-15 20:23:12 -04:00
2026-05-31 16:36:07 -04:00
2026-06-23 17:42:11 -04:00
2026-06-04 17:45:53 -04:00
2026-04-13 09:49:11 -04:00
2026-05-07 13:41:10 -04:00
2026-05-19 19:49:16 -04:00
2026-06-16 00:42:33 -04:00
2026-06-24 20:05:17 -04:00
2026-05-25 21:09:00 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-04-17 07:57:08 -04:00
2026-06-23 17:42:11 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-05-17 05:25:00 -04:00
2026-05-14 10:20:57 -04:00
2026-06-06 11:18:36 -04:00
2026-06-06 11:18:36 -04:00
2026-06-02 21:40:38 -04:00
2026-06-02 16:11:24 -04:00
2026-06-08 08:58:49 -04:00
2026-06-24 19:57:49 -04:00
2026-04-14 13:47:48 -04:00
2026-05-31 16:00:38 -04:00
2026-06-21 17:58:00 -04:00
2026-06-21 18:20:57 -04:00
2026-06-07 15:48:04 -04:00
2026-06-18 18:25:58 -04:00
2026-06-18 18:25:58 -04:00
2026-06-20 11:58:42 -04:00
2026-06-20 11:58:42 -04:00
2026-06-20 11:58:42 -04:00
2026-06-20 11:58:42 -04:00
2026-06-02 21:40:38 -04:00
2026-04-14 08:23:05 -04:00
2026-06-12 02:15:11 -04:00
2026-06-24 23:22:13 -04:00
2026-06-11 00:26:26 -04:00
2026-05-25 01:46:08 -04:00
2026-05-25 01:46:08 -04:00
2026-06-22 19:33:06 -04:00
2026-05-24 01:06:22 -04:00
2026-06-24 21:02:15 -04:00
2026-06-22 19:33:06 -04:00
2026-06-23 10:44:49 -04:00
2026-06-23 10:44:49 -04:00
2026-06-18 23:29:20 -04:00
2026-06-20 11:52:28 -04:00
2026-05-14 10:21:08 -04:00
2026-06-17 13:25:12 -04:00
2026-05-31 20:28:18 -04:00
2026-05-23 00:04:05 -04:00
2026-05-22 01:27:27 -04:00
2026-06-08 08:44:59 -04:00
2026-06-24 20:05:17 -04:00
2026-05-07 13:16:24 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-06-01 17:27:25 -04:00
2026-06-01 17:27:25 -04:00
2026-06-01 17:27:59 -04:00
2026-05-28 20:51:45 -04:00
2026-06-17 13:24:55 -04:00
2026-05-29 09:43:37 -04:00
2026-06-17 13:24:55 -04:00
2026-06-17 13:24:55 -04:00
2026-06-24 20:05:17 -04:00
2026-05-29 21:09:20 -04:00
2026-06-11 00:26:26 -04:00
2026-05-17 17:31:57 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-06-01 19:47:06 -04:00
2026-04-16 20:32:38 -04:00
2026-06-17 13:24:55 -04:00
2026-06-15 20:06:13 -04:00
2026-06-05 22:35:04 -04:00
2026-06-05 22:35:04 -04:00
2026-06-05 22:35:04 -04:00
2026-04-24 10:20:08 -04:00
2026-06-18 13:38:19 -04:00
2026-06-04 17:45:53 -04:00
2026-04-13 12:49:03 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-05-29 21:09:20 -04:00
2026-05-29 21:09:20 -04:00
2026-05-09 00:11:09 -04:00
2026-05-23 18:09:39 -04:00
2026-05-18 16:48:09 -04:00
2026-05-18 16:48:09 -04:00
2026-05-08 15:51:39 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-06-02 16:12:13 -04:00
2026-05-14 20:51:42 -04:00
2026-05-17 22:00:31 -04:00
2026-05-16 14:58:19 -04:00
2026-05-15 14:33:57 -04:00
2026-05-14 20:51:42 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-05-17 22:00:31 -04:00
2026-05-22 13:20:27 -04:00
2026-05-22 21:08:56 -04:00
2026-05-18 01:52:18 -04:00
2026-05-17 22:00:31 -04:00
2026-05-17 14:01:39 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-05-07 19:23:11 -04:00
2026-05-07 19:23:11 -04:00
2026-06-03 16:11:00 -04:00
2026-06-17 13:24:55 -04:00
2026-06-12 02:15:11 -04:00
2026-06-24 19:50:45 -04:00
2026-06-08 08:58:14 -04:00
2026-05-01 18:57:44 -04:00
2026-06-02 09:51:42 -04:00
2026-05-14 10:21:08 -04:00
2026-06-04 17:45:53 -04:00
2026-05-19 19:49:16 -04:00
2026-06-02 10:26:31 -04:00
2026-05-17 20:11:44 -04:00
2026-05-29 21:09:57 -04:00
2026-06-04 17:45:53 -04:00
2026-05-29 21:09:57 -04:00
2026-05-08 11:59:02 -04:00
2026-05-08 03:48:35 -04:00
2026-05-08 10:00:15 -04:00
2026-05-14 20:51:42 -04:00
2026-05-08 09:03:22 -04:00
2026-05-14 20:51:42 -04:00
2026-05-07 21:28:35 -04:00
2026-05-20 12:53:29 -04:00
2026-05-21 01:00:47 -04:00
2026-05-07 23:45:16 -04:00
2026-05-20 03:35:25 -04:00
2026-05-07 21:28:35 -04:00
2026-05-17 22:00:31 -04:00
2026-05-08 16:21:34 -04:00
2026-04-17 20:31:43 -04:00
2026-05-16 14:58:19 -04:00
2026-05-08 09:02:59 -04:00
2026-05-07 23:51:52 -04:00
2026-05-17 01:16:21 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 20:05:17 -04:00
2026-06-20 15:06:26 -04:00
2026-06-10 11:35:39 -04:00
2026-06-24 19:48:34 -04:00
2026-05-28 14:16:46 -04:00
2026-04-09 17:56:58 -04:00
2026-06-02 16:11:24 -04:00
2026-06-08 08:59:27 -04:00
2026-04-14 17:58:57 -04:00
2026-06-04 17:45:53 -04:00
2026-05-23 16:03:48 -04:00
2026-05-13 09:40:45 -04:00
2026-06-04 17:45:53 -04:00
2026-06-24 20:05:17 -04:00
2026-06-24 21:02:15 -04:00
2026-06-24 23:00:56 -04:00
2026-06-04 17:45:53 -04:00
2026-06-24 23:00:56 -04:00
2026-06-20 11:58:42 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-06-24 20:05:17 -04:00
2026-06-16 00:42:33 -04:00
2026-06-16 00:42:33 -04:00
2026-06-08 08:58:14 -04:00
2026-06-12 19:07:45 -04:00
2026-06-08 08:58:14 -04:00
2026-06-23 17:42:11 -04:00
2026-06-17 13:24:55 -04:00
2026-06-23 10:01:09 -04:00
2026-06-20 11:58:42 -04:00
2026-04-16 20:32:38 -04:00
2026-06-08 08:44:59 -04:00
2026-05-19 07:27:12 -04:00
2026-06-04 17:45:53 -04:00
2026-05-19 00:13:57 -04:00
2026-05-25 21:25:59 -04:00
2026-05-28 12:45:10 -04:00
2026-06-04 17:45:53 -04:00
2026-06-24 20:05:17 -04:00
2026-06-19 00:44:36 -04:00
2026-06-04 17:45:53 -04:00
2026-05-24 15:43:36 -04:00
2026-06-06 22:21:30 -04:00
2026-06-12 02:15:11 -04:00
2026-06-21 18:16:20 -04:00
2026-05-25 01:29:47 -04:00
2026-06-22 19:33:06 -04:00
2026-04-12 05:43:15 -04:00
2026-05-24 16:07:54 -04:00
2026-05-24 01:12:07 -04:00
2026-06-18 13:38:19 -04:00
2026-05-24 16:07:54 -04:00
2026-05-24 15:44:12 -04:00
2026-04-25 17:26:04 -04:00
2026-06-02 19:53:45 -04:00
2026-05-24 15:18:47 -04:00
2026-06-11 00:26:26 -04:00
2026-05-13 09:40:45 -04:00
2026-06-20 15:06:26 -04:00
2026-06-20 15:06:26 -04:00
2026-06-20 15:06:26 -04:00
2026-06-23 17:42:11 -04:00
2026-05-07 16:18:19 -04:00
2026-05-23 00:04:05 -04:00
2026-05-21 23:10:13 -04:00
2026-05-29 11:46:51 -04:00
2026-05-29 11:46:51 -04:00
2026-06-04 17:45:53 -04:00
2026-05-08 15:24:25 -04:00
2026-06-16 00:42:33 -04:00
2026-05-07 19:23:11 -04:00
2026-06-12 19:07:45 -04:00
2026-04-17 07:57:08 -04:00
2026-06-23 17:42:11 -04:00
2026-05-07 19:23:11 -04:00
2026-06-11 00:26:26 -04:00
2026-06-18 13:38:19 -04:00
2026-06-11 00:26:26 -04:00
2026-06-18 13:38:19 -04:00
2026-06-18 13:38:19 -04:00
2026-06-04 17:45:53 -04:00
2026-06-04 17:45:53 -04:00
2026-04-24 22:23:31 -04:00
2026-06-22 19:33:06 -04:00
2026-04-16 20:32:38 -04:00
2026-06-17 13:24:55 -04:00
2026-06-11 00:26:26 -04:00