lyss 0.8.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. lyss-0.8.0/CHANGELOG.md +216 -0
  2. lyss-0.8.0/LICENSE +661 -0
  3. lyss-0.8.0/LICENSE-SPEC +396 -0
  4. lyss-0.8.0/MANIFEST.in +10 -0
  5. lyss-0.8.0/NOTICE +43 -0
  6. lyss-0.8.0/PKG-INFO +210 -0
  7. lyss-0.8.0/README.md +165 -0
  8. lyss-0.8.0/TRADEMARKS.md +32 -0
  9. lyss-0.8.0/adapters/cisco_ios.yaml +260 -0
  10. lyss-0.8.0/adapters/cisco_sb.yaml +268 -0
  11. lyss-0.8.0/adapters/hp_procurve.yaml +248 -0
  12. lyss-0.8.0/adapters/mikrotik.yaml +292 -0
  13. lyss-0.8.0/adapters/sonic.yaml +218 -0
  14. lyss-0.8.0/data/firmware.yaml +147 -0
  15. lyss-0.8.0/pyproject.toml +64 -0
  16. lyss-0.8.0/setup.cfg +4 -0
  17. lyss-0.8.0/setup.py +42 -0
  18. lyss-0.8.0/spec/lyss-spec.yaml +345 -0
  19. lyss-0.8.0/src/lyss/__init__.py +7 -0
  20. lyss-0.8.0/src/lyss/__main__.py +248 -0
  21. lyss-0.8.0/src/lyss/changes.py +123 -0
  22. lyss-0.8.0/src/lyss/collector.py +488 -0
  23. lyss-0.8.0/src/lyss/config.py +126 -0
  24. lyss-0.8.0/src/lyss/discovery.py +277 -0
  25. lyss-0.8.0/src/lyss/engine.py +505 -0
  26. lyss-0.8.0/src/lyss/events.py +130 -0
  27. lyss-0.8.0/src/lyss/firmware.py +304 -0
  28. lyss-0.8.0/src/lyss/history.py +159 -0
  29. lyss-0.8.0/src/lyss/inventory.py +220 -0
  30. lyss-0.8.0/src/lyss/notify.py +145 -0
  31. lyss-0.8.0/src/lyss/oxidized.py +125 -0
  32. lyss-0.8.0/src/lyss/remediate.py +450 -0
  33. lyss-0.8.0/src/lyss/report.py +93 -0
  34. lyss-0.8.0/src/lyss/scan.py +110 -0
  35. lyss-0.8.0/src/lyss/scheduler.py +81 -0
  36. lyss-0.8.0/src/lyss/sim/__init__.py +10 -0
  37. lyss-0.8.0/src/lyss/sim/config.py +200 -0
  38. lyss-0.8.0/src/lyss/sim/demo.py +147 -0
  39. lyss-0.8.0/src/lyss/sim/lab.py +203 -0
  40. lyss-0.8.0/src/lyss/sim/labs/demo/demo-acc-01.cfg +143 -0
  41. lyss-0.8.0/src/lyss/sim/labs/demo/demo-acc-02.cfg +136 -0
  42. lyss-0.8.0/src/lyss/sim/labs/demo/demo-core.cfg +304 -0
  43. lyss-0.8.0/src/lyss/sim/labs/demo/demo-crs-01.cfg +18 -0
  44. lyss-0.8.0/src/lyss/sim/labs/demo/demo-crs-01.state +90 -0
  45. lyss-0.8.0/src/lyss/sim/labs/demo/demo-hp-01.cfg +20 -0
  46. lyss-0.8.0/src/lyss/sim/labs/demo/demo-leaf-01.cfg +41 -0
  47. lyss-0.8.0/src/lyss/sim/labs/demo/demo-leaf-01.state +53 -0
  48. lyss-0.8.0/src/lyss/sim/labs/demo/demo-sb-01.cfg +118 -0
  49. lyss-0.8.0/src/lyss/sim/labs/demo/demo-sb-02.cfg +99 -0
  50. lyss-0.8.0/src/lyss/sim/labs/demo/lab.yaml +144 -0
  51. lyss-0.8.0/src/lyss/sim/render.py +445 -0
  52. lyss-0.8.0/src/lyss/sim/server.py +437 -0
  53. lyss-0.8.0/src/lyss/sites.py +162 -0
  54. lyss-0.8.0/src/lyss/topology.py +303 -0
  55. lyss-0.8.0/src/lyss/vault.py +109 -0
  56. lyss-0.8.0/src/lyss/web/__init__.py +2 -0
  57. lyss-0.8.0/src/lyss/web/app.py +996 -0
  58. lyss-0.8.0/src/lyss/web/static/app.js +139 -0
  59. lyss-0.8.0/src/lyss/web/static/favicon.svg +9 -0
  60. lyss-0.8.0/src/lyss/web/static/firmware.js +19 -0
  61. lyss-0.8.0/src/lyss/web/static/maroc.svg +25 -0
  62. lyss-0.8.0/src/lyss/web/static/remediation.js +57 -0
  63. lyss-0.8.0/src/lyss/web/static/style.css +382 -0
  64. lyss-0.8.0/src/lyss/web/static/topology.js +290 -0
  65. lyss-0.8.0/src/lyss/web/static/zellige.svg +18 -0
  66. lyss-0.8.0/src/lyss/web/templates/_hero.html +14 -0
  67. lyss-0.8.0/src/lyss/web/templates/_macros.html +16 -0
  68. lyss-0.8.0/src/lyss/web/templates/backup_diff.html +22 -0
  69. lyss-0.8.0/src/lyss/web/templates/base.html +47 -0
  70. lyss-0.8.0/src/lyss/web/templates/dashboard.html +163 -0
  71. lyss-0.8.0/src/lyss/web/templates/device.html +147 -0
  72. lyss-0.8.0/src/lyss/web/templates/device_form.html +78 -0
  73. lyss-0.8.0/src/lyss/web/templates/discovery.html +110 -0
  74. lyss-0.8.0/src/lyss/web/templates/firmware.html +79 -0
  75. lyss-0.8.0/src/lyss/web/templates/login.html +20 -0
  76. lyss-0.8.0/src/lyss/web/templates/matrix.html +48 -0
  77. lyss-0.8.0/src/lyss/web/templates/remediation.html +96 -0
  78. lyss-0.8.0/src/lyss/web/templates/report.html +154 -0
  79. lyss-0.8.0/src/lyss/web/templates/settings.html +270 -0
  80. lyss-0.8.0/src/lyss/web/templates/setup.html +22 -0
  81. lyss-0.8.0/src/lyss/web/templates/topology.html +45 -0
  82. lyss-0.8.0/src/lyss.egg-info/PKG-INFO +210 -0
  83. lyss-0.8.0/src/lyss.egg-info/SOURCES.txt +141 -0
  84. lyss-0.8.0/src/lyss.egg-info/dependency_links.txt +1 -0
  85. lyss-0.8.0/src/lyss.egg-info/entry_points.txt +2 -0
  86. lyss-0.8.0/src/lyss.egg-info/requires.txt +14 -0
  87. lyss-0.8.0/src/lyss.egg-info/top_level.txt +1 -0
  88. lyss-0.8.0/tests/cases/hp-config-only/expected.yaml +15 -0
  89. lyss-0.8.0/tests/cases/hp-hardened/config.cfg +43 -0
  90. lyss-0.8.0/tests/cases/hp-hardened/expected.yaml +25 -0
  91. lyss-0.8.0/tests/cases/hp-hardened/state.txt +92 -0
  92. lyss-0.8.0/tests/cases/hp-weak/config.cfg +15 -0
  93. lyss-0.8.0/tests/cases/hp-weak/expected.yaml +26 -0
  94. lyss-0.8.0/tests/cases/hp-weak/state.txt +47 -0
  95. lyss-0.8.0/tests/cases/ios-hardened/config.cfg +52 -0
  96. lyss-0.8.0/tests/cases/ios-hardened/expected.yaml +25 -0
  97. lyss-0.8.0/tests/cases/ios-hardened/state.txt +36 -0
  98. lyss-0.8.0/tests/cases/ios-weak/config.cfg +25 -0
  99. lyss-0.8.0/tests/cases/ios-weak/expected.yaml +25 -0
  100. lyss-0.8.0/tests/cases/ios-weak/state.txt +23 -0
  101. lyss-0.8.0/tests/cases/mikrotik-hardened/config.cfg +31 -0
  102. lyss-0.8.0/tests/cases/mikrotik-hardened/expected.yaml +27 -0
  103. lyss-0.8.0/tests/cases/mikrotik-hardened/state.txt +67 -0
  104. lyss-0.8.0/tests/cases/mikrotik-v6/config.cfg +7 -0
  105. lyss-0.8.0/tests/cases/mikrotik-v6/expected.yaml +10 -0
  106. lyss-0.8.0/tests/cases/mikrotik-v6/state.txt +17 -0
  107. lyss-0.8.0/tests/cases/mikrotik-weak/config.cfg +13 -0
  108. lyss-0.8.0/tests/cases/mikrotik-weak/expected.yaml +26 -0
  109. lyss-0.8.0/tests/cases/mikrotik-weak/state.txt +60 -0
  110. lyss-0.8.0/tests/cases/sb-config-only/expected.yaml +14 -0
  111. lyss-0.8.0/tests/cases/sb-hardened/config.cfg +52 -0
  112. lyss-0.8.0/tests/cases/sb-hardened/expected.yaml +25 -0
  113. lyss-0.8.0/tests/cases/sb-hardened/state.txt +56 -0
  114. lyss-0.8.0/tests/cases/sb-weak/config.cfg +22 -0
  115. lyss-0.8.0/tests/cases/sb-weak/expected.yaml +25 -0
  116. lyss-0.8.0/tests/cases/sb-weak/state.txt +39 -0
  117. lyss-0.8.0/tests/cases/sonic-hardened/config.cfg +43 -0
  118. lyss-0.8.0/tests/cases/sonic-hardened/expected.yaml +26 -0
  119. lyss-0.8.0/tests/cases/sonic-hardened/state.txt +46 -0
  120. lyss-0.8.0/tests/cases/sonic-weak/config.cfg +33 -0
  121. lyss-0.8.0/tests/cases/sonic-weak/expected.yaml +26 -0
  122. lyss-0.8.0/tests/cases/sonic-weak/state.txt +48 -0
  123. lyss-0.8.0/tests/conftest.py +58 -0
  124. lyss-0.8.0/tests/test_attribution.py +31 -0
  125. lyss-0.8.0/tests/test_changes.py +128 -0
  126. lyss-0.8.0/tests/test_ciso_library.py +182 -0
  127. lyss-0.8.0/tests/test_controls.py +120 -0
  128. lyss-0.8.0/tests/test_firmware.py +131 -0
  129. lyss-0.8.0/tests/test_integrations.py +226 -0
  130. lyss-0.8.0/tests/test_jump_source.py +104 -0
  131. lyss-0.8.0/tests/test_mikrotik.py +142 -0
  132. lyss-0.8.0/tests/test_notify.py +93 -0
  133. lyss-0.8.0/tests/test_private.py +49 -0
  134. lyss-0.8.0/tests/test_remediate.py +301 -0
  135. lyss-0.8.0/tests/test_review_fixes.py +138 -0
  136. lyss-0.8.0/tests/test_sim.py +177 -0
  137. lyss-0.8.0/tests/test_sites.py +113 -0
  138. lyss-0.8.0/tests/test_sonic.py +79 -0
  139. lyss-0.8.0/tests/test_spec.py +38 -0
  140. lyss-0.8.0/tests/test_units.py +262 -0
  141. lyss-0.8.0/tests/test_wazuh_dashboard.py +48 -0
  142. lyss-0.8.0/tests/test_wazuh_rules.py +83 -0
  143. lyss-0.8.0/tests/test_web.py +157 -0
@@ -0,0 +1,216 @@
1
+ # Changelog
2
+
3
+ Specification versions (`spec_version`) and tool versions are tracked together until 1.0.
4
+
5
+ ## 0.8.0 (2026-11-06)
6
+
7
+ Two more platforms (MikroTik RouterOS and SONiC, preview), both in the demo; `pip install lyss`;
8
+ Oxidized backups of MikroTik routers; a least-privilege account guide. Specification unchanged
9
+ (0.5.0-draft).
10
+
11
+ - `pip install lyss`: the wheel bundles the specification, the adapters and the firmware data
12
+ (copied by setup.py at build time from the top of the repository, where they stay). An installed
13
+ LYSS keeps its data in `%LOCALAPPDATA%\LYSS` (Windows) or `$XDG_DATA_HOME/lyss`
14
+ (`~/.local/share/lyss`), never next to its code. Releases are published to PyPI by
15
+ `.github/workflows/release.yml` with Trusted Publishing (no stored token), after a smoke test of
16
+ the wheel outside the repository.
17
+
18
+ - Demo lab: two more simulated switches, DEMO-CRS-01 (MikroTik CRS326, RouterOS factory defaults,
19
+ 7.24.1 = one point release before the CISA KEV fixes) and demo-leaf-01 (SONiC campus switch,
20
+ `public` SNMP community and cleartext TACACS+ key); read-only simulator platforms with fixed
21
+ outputs. Topology reads RouterOS and SONiC host names.
22
+ - docs/ACCOUNTS.md: a least-privilege LYSS account per platform. Verified in the lab: a RouterOS
23
+ group with `ssh,read` only (no `sensitive`) and a SONiC user without sudo collect exactly what
24
+ `admin` collects, and cannot change anything. Finding: on SONiC every local account can read
25
+ the whole config_db, cleartext TACACS+/RADIUS keys included.
26
+ - Oxidized: `routeros` nodes are assessed (MikroTik adapter). Hierarchical RouterOS exports are
27
+ rewritten one command per line; Oxidized's `# version:` / `# board-name:` comments give the
28
+ firmware facts; configuration-only rules use the fact that an export lists every non-default
29
+ setting (engine: `absent: true` on configuration line rules, never decisive on an empty file).
30
+
31
+ - MikroTik RouterOS adapter (preview), validated on CHR 7.25.1: configuration from
32
+ `/export terse` (secrets never collected), device state from `print terse` (services, SSH,
33
+ SNMP, NTP, logging, users, RADIUS, note, Ethernet ports, bridge ports, MAC-Winbox). Factory
34
+ defaults it reports: Telnet/FTP/HTTP/API open to every address, `strong-crypto=no`,
35
+ MAC-Winbox on every interface, no NTP, no remote syslog. Discovery recognises `SSH-2.0-ROSSSH`
36
+ and MikroTik LLDP descriptions. No automatic remediation.
37
+ - RouterOS has no SSH pre-authentication banner (checked on 7.25.1): LYSS-MGMT-012 needs the note
38
+ both before the console/Telnet login (`show-at-cli-login`) and at SSH/Winbox login (`show-at-login`).
39
+ - Firmware data: RouterOS advisories checked against NVD and the CISA KEV catalog (2026.11.04),
40
+ including CVE-2026-86060/67277/67279 (KEV), CVE-2026-84411 (9.8), CVE-2026-67278 (9.1),
41
+ CVE-2023-30799, CVE-2018-7445 and CVE-2018-14847. `fixed_in` can now list the first fixed
42
+ version of each release line (e.g. 6.49.21 / 7.23.4 long-term / 7.24.2 stable), with an optional
43
+ `affected_from`.
44
+ - Engine: `{all: [rules]}` combinator; RouterOS SNMP community names are redacted from evidence
45
+ (`public`/`private` stay visible, being the finding).
46
+
47
+ - SONiC adapter (preview), validated on SONiC-VS 202505: the config_db JSON
48
+ (`show runningconfiguration all`) is flattened into one block per table entry
49
+ (`TABLE|key` + `field=value` lines); device state from `show version`, `show interfaces status`,
50
+ `show ntp`, `show ssh` and `ss -tlnH`. Collection is read-only (no sudo). Discovery recognises
51
+ SONiC from its LLDP description; it has no automatic remediation.
52
+ - Findings from the lab: `config tacacs add --key` stores the key in cleartext in config_db
53
+ (LYSS-AUTH-004 fails), and the SNMP community "public" comes back after
54
+ `config snmp community del public` while /etc/sonic/snmp.yml still holds `snmp_rocommunity`
55
+ (the remediation removes it first).
56
+ - SONiC LYSS-AUTH-004: an encrypted global TACACS+ key (`TACPLUS|global` `key_encrypt=true`,
57
+ `config tacacs passkey <key> --encrypt`) passes; per-server and RADIUS keys stay cleartext and
58
+ fail. Engine: new block filter `where_not`. The SNMP note cites sonic-buildimage#18061 / #26952.
59
+ - Redaction covers JSON fields (`passkey=`, `*password*=`, `*secret*=`, `*key*=`) and
60
+ non-default SNMP community names in `SNMP_COMMUNITY|<name>` headers.
61
+ - Tests: preview adapters must show each control both ways or give the reason why not.
62
+
63
+ ## 0.7.0 (2026-11-05)
64
+
65
+ Specification 0.5.0-draft
66
+ Test procedures tightened where they were looser than their statements (review of the CISO
67
+ Assistant library, intuitem/ciso-assistant-community#5246); verdicts can change from pass to fail.
68
+ - LYSS-AUTH-002: strong hash only (SHA-256 or stronger: scrypt, PBKDF2-SHA-256, SHA-256/512
69
+ crypt). MD5 (Cisco type 5), SHA-1 (40-hex values on Cisco Business, HPE "sha1") and Cisco type 4
70
+ fail; a full-privilege local account with a weak or reversible password fails too.
71
+ - LYSS-AUTH-004: the procedure no longer depends on the level (reversible encodings are not
72
+ cleartext; irreversible storage is planned as a separate Level 2 control).
73
+ - LYSS-AUTH-010: every login list used for remote access must start with RADIUS/TACACS+.
74
+ - LYSS-AUTH-011: SNMPv3 groups or users below authPriv fail.
75
+ - LYSS-MGMT-011: an access port in the management VLAN fails.
76
+ - LYSS-MGMT-012: the pre-login banner must state the authorized-use restriction; exec banners
77
+ (after login) do not count.
78
+ - LYSS-LOG-010: "no logging on" fails. LYSS-LOG-011: an unsynchronized clock fails (device state).
79
+ - LYSS-ACC-011: only trunk / aggregation ports are uplinks; neighbour discovery never exempts a port.
80
+ - LYSS-VULN-001, LYSS-BKP-001: procedures aligned with their statements.
81
+ - Level 3 controls without text are not assessable in the CISO Assistant library.
82
+
83
+ Tool
84
+ - New rule form `captures_in_both` (a value found in two places, e.g. the management VLAN on
85
+ access ports); `show ntp status` (IOS) and `show sntp status` (Cisco Business) collected.
86
+
87
+ Wazuh
88
+ - Per-control rules (100810-100869) generated from the specification, with NIST SP 800-53 groups:
89
+ LYSS findings appear in Wazuh's NIST 800-53 compliance dashboard. `install.sh --regression-level`.
90
+ - Dashboard "LYSS - Switch security" (lyss-dashboard.ndjson); agent group script for the events file.
91
+ - Decoders for Cisco IOS timestamps with a time zone offset and for Cisco Business messages, with
92
+ rules for management sessions, refused logins and password guessing.
93
+ - Rescan on change (Settings): LYSS reads configuration-change and session-end alerts from the Wazuh
94
+ dashboard with a read-only account (reader-account.sh) and rescans the switch at once; LYSS's own
95
+ sessions are ignored.
96
+
97
+ Contributors
98
+ - Thanks to **juanmig7890** for the first outside contribution: Linux and macOS quick start in
99
+ the tester guide (#5).
100
+
101
+ Integrations
102
+ - SIEM events: after each scan, JSON events per switch (level, counts), per failed control,
103
+ regression, fix and collection error, plus discovered switches; sent over syslog (UDP/TCP,
104
+ RFC 3164, program "lyss") and/or appended to a JSON-lines file for a local agent. Settings →
105
+ SIEM events, with a test event. Wazuh decoder, rules (100800-100809) and install script in
106
+ integrations/wazuh, tested with wazuh-logtest and end to end (syslog UDP) on Wazuh 4.14.
107
+ - CISO Assistant library (integrations/ciso-assistant), generated from the specification by
108
+ tools/build_ciso_library.py: the LYSS framework (levels, domains, controls with rationale and
109
+ test procedure; levels as implementation groups) and a LYSS → ISO/IEC 27001:2022 mapping (one
110
+ direction only: an ISO control judged compliant proves nothing about a switch). Draft
111
+ specifications say so in the library name. Imported and checked in CISO Assistant 4.1, including
112
+ an ISO 27001 audit prefilled from a LYSS audit; `--excel` writes upstream's Excel v2 source
113
+ workbooks, validated with upstream's checker and converter.
114
+ - Oxidized: `python -m lyss oxidized --url ...` assesses the configurations Oxidized backs up
115
+ (REST API, read-only, no SSH to the switches); a recent successful Oxidized backup is evidence
116
+ for LYSS-BKP-001; secrets hidden by Oxidized give "unknown", never a false verdict; `--events`
117
+ sends the results to the SIEM.
118
+
119
+ ## 0.6.0 (2026-11-05): first public release
120
+
121
+ Licence
122
+ - The software moves from Apache 2.0 to the GNU AGPL v3 (AGPL-3.0-only) with additional terms
123
+ (section 7): the attribution "LYSS by Mouad Lyaazale · Made in Morocco" must be kept in the web
124
+ interface footer, the login page and the reports; modified versions must be marked as such;
125
+ no rights to the LYSS names and logo (TRADEMARKS.md). The specification stays CC BY 4.0.
126
+ SPDX headers in every source file; a test guards the attribution.
127
+
128
+ Public release
129
+ - The source code is public. Vulnerabilities are reported privately (SECURITY.md); contributions
130
+ are signed off under the Developer Certificate of Origin (CONTRIBUTING.md, checked on pull
131
+ requests); issue templates for wrong verdicts, errors and new platforms.
132
+
133
+ Early access
134
+ - Tester guide (docs/TESTERS.md). `Start-LYSS.cmd` installs LYSS on the first start;
135
+ `Start-LYSS-Demo.cmd` starts the demo with one double-click.
136
+ - `tools/sync_export.py`: updates the export repository with the current version as one new
137
+ commit, after the same checks as the first export (internal terms, private addresses, secrets).
138
+
139
+ Tool
140
+ - Sites (head office, agencies, subsidiaries): named address ranges in Settings; each switch
141
+ belongs to the site containing its address (most specific range wins) unless a site is set on
142
+ the switch. Dashboard per-site totals and filter, "Scan this site", per-site HTML/JSON reports,
143
+ site shown on discovered switches and on the switch page.
144
+ - Discovery: "Scan a site" at a gentle rate (6 parallel probes, pause between probes) so VPN
145
+ tunnels and remote firewalls/IPS stay quiet; site ranges larger than /20 are skipped.
146
+
147
+ ## 0.5.0 (2026-11)
148
+
149
+ Tool
150
+ - HPE Aruba AOS-S (HP ProCurve) adapter complete: every Level 1 and Level 2 control, device
151
+ state collection, model/firmware from the device or from the configuration header, port-list
152
+ rules (trunks and tagged ports are uplinks, "spanning-tree <ports> bpdu-protection"), LLDP
153
+ neighbours on the topology map, basic remediation (Telnet, plain HTTP, idle timeout, default
154
+ community, banner, syslog).
155
+ - Switch simulator (`python -m lyss sim`): fictitious Cisco IOS, Cisco Small Business and HPE
156
+ Aruba switches over SSH, faithful enough for the real collector, topology and remediation.
157
+ - Demo mode (`python -m lyss demo`): simulated network + web interface on a separate data folder,
158
+ only invented data.
159
+ - SNMPv3 user secrets (`auth sha ... priv aes ...`) are now redacted in evidence and reports.
160
+ - The SSH host key algorithm is recorded from an unbiased handshake (LYSS-MGMT-013 no longer
161
+ reports `ssh-rsa` for switches that support rsa-sha2).
162
+ - First parallel scan: each SSH session reads a private copy of the pinned host key (no more
163
+ intermittent "not found in known_hosts").
164
+ - `tools/export_public.py`: builds a public repository without history, with internal-term,
165
+ private-address and secret checks.
166
+
167
+ ## 0.4.0 (2026-11-04)
168
+
169
+ Specification 0.4.0-draft
170
+ - Section 7.1: requirements for optional remediation (off by default, preview, low-risk only,
171
+ backup, rollback, verification before save, change log).
172
+
173
+ Tool
174
+ - Remediation module (disabled by default): low-risk fixes for Cisco IOS and Cisco SB with
175
+ generated rollbacks (Telnet, plain HTTP, default SNMP communities, SSH v2, idle timeout, banner,
176
+ syslog, NTP) and a web-interface mitigation for unpatchable Cisco SB models; one switch at a
177
+ time, automatic rollback, verification over a new connection, save only after verification,
178
+ change log. Scans and remediation never run at the same time.
179
+ - Firmware upgrade for Cisco Catalyst 1000: image upload checked against Cisco's MD5/SHA-512, staging without reboot (temporary SCP server, verify /md5, archive download-sw /safe /no-set-boot, boot variable checked unchanged), separate activation confirmed by typing the switch name (boot system, reload, wait, version check, scan); links cut during the reboot shown from the topology.
180
+ - Discovery no longer lists dropbear SSH servers (access points, IoT) as switches.
181
+
182
+ ## 0.3.0 (2026-11-04)
183
+
184
+ Specification 0.3.0-draft
185
+ - Every Level 1-2 control has a requirement, rationale, vendor-neutral test procedure and
186
+ informative mappings to ISO/IEC 27001:2022, NIST SP 800-53 r5 and CIS Controls v8.
187
+ - LYSS-VULN-001 also covers known-exploited vulnerabilities (CISA KEV) and the end of
188
+ security support.
189
+ - LYSS-BKP-001 is evaluable: automatic (scheduled) configuration backups or an attested external
190
+ backup system.
191
+ - LYSS-AUTH-002 passes when there is no enable credential and privileged access only uses hashed
192
+ local accounts.
193
+ - New document `docs/LYSS-Specification.md` (generated), conformance claims, adapter and tool
194
+ requirements, versioning policy.
195
+
196
+ Tool
197
+ - Configuration archive with redacted diffs, scan history and trends, regression detection.
198
+ - Scheduled scans (in the interface, or `lyss collect --scheduled` with cron / Task Scheduler).
199
+ - E-mail alerts and CISO Assistant evidence push (disabled by default).
200
+ - Portable AES-256-GCM vault for Linux; Dockerfile and docker-compose; `LYSS_DATA_DIR`, `LYSS_HOME`.
201
+ - Firmware knowledge base: Catalyst 1000 (KEV CVE-2025-20352, end of security support 2028),
202
+ SG350 and SG300 end of support, Cisco Business 250/350, HPE Aruba AOS-S (HPESBNW05156).
203
+ - Test suite: per-control pass/fail cases, unit, web and private regression tests; pre-commit
204
+ hook and CI workflow (Windows and Linux).
205
+ - Fixes: Cisco SB `enable password level 15 encrypted` false failure; redaction of the word "level".
206
+
207
+ ## 0.2.0 (2026-11-03)
208
+
209
+ - Level 2 controls, device state collection, firmware check (LYSS-VULN-001), SSH crypto control
210
+ (LYSS-MGMT-013), edge-port BPDU guard detection.
211
+ - Web interface, parallel read-only collector, reports, control matrix, topology map, discovery
212
+ (neighbours and SSH range scan), credential profiles, platform auto-detection.
213
+
214
+ ## 0.1.0 (2026-11-03)
215
+
216
+ - First draft: Level 1 controls, Cisco IOS / Cisco SB / HP ProCurve adapters, command-line audit.