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.
- lyss-0.8.0/CHANGELOG.md +216 -0
- lyss-0.8.0/LICENSE +661 -0
- lyss-0.8.0/LICENSE-SPEC +396 -0
- lyss-0.8.0/MANIFEST.in +10 -0
- lyss-0.8.0/NOTICE +43 -0
- lyss-0.8.0/PKG-INFO +210 -0
- lyss-0.8.0/README.md +165 -0
- lyss-0.8.0/TRADEMARKS.md +32 -0
- lyss-0.8.0/adapters/cisco_ios.yaml +260 -0
- lyss-0.8.0/adapters/cisco_sb.yaml +268 -0
- lyss-0.8.0/adapters/hp_procurve.yaml +248 -0
- lyss-0.8.0/adapters/mikrotik.yaml +292 -0
- lyss-0.8.0/adapters/sonic.yaml +218 -0
- lyss-0.8.0/data/firmware.yaml +147 -0
- lyss-0.8.0/pyproject.toml +64 -0
- lyss-0.8.0/setup.cfg +4 -0
- lyss-0.8.0/setup.py +42 -0
- lyss-0.8.0/spec/lyss-spec.yaml +345 -0
- lyss-0.8.0/src/lyss/__init__.py +7 -0
- lyss-0.8.0/src/lyss/__main__.py +248 -0
- lyss-0.8.0/src/lyss/changes.py +123 -0
- lyss-0.8.0/src/lyss/collector.py +488 -0
- lyss-0.8.0/src/lyss/config.py +126 -0
- lyss-0.8.0/src/lyss/discovery.py +277 -0
- lyss-0.8.0/src/lyss/engine.py +505 -0
- lyss-0.8.0/src/lyss/events.py +130 -0
- lyss-0.8.0/src/lyss/firmware.py +304 -0
- lyss-0.8.0/src/lyss/history.py +159 -0
- lyss-0.8.0/src/lyss/inventory.py +220 -0
- lyss-0.8.0/src/lyss/notify.py +145 -0
- lyss-0.8.0/src/lyss/oxidized.py +125 -0
- lyss-0.8.0/src/lyss/remediate.py +450 -0
- lyss-0.8.0/src/lyss/report.py +93 -0
- lyss-0.8.0/src/lyss/scan.py +110 -0
- lyss-0.8.0/src/lyss/scheduler.py +81 -0
- lyss-0.8.0/src/lyss/sim/__init__.py +10 -0
- lyss-0.8.0/src/lyss/sim/config.py +200 -0
- lyss-0.8.0/src/lyss/sim/demo.py +147 -0
- lyss-0.8.0/src/lyss/sim/lab.py +203 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-acc-01.cfg +143 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-acc-02.cfg +136 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-core.cfg +304 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-crs-01.cfg +18 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-crs-01.state +90 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-hp-01.cfg +20 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-leaf-01.cfg +41 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-leaf-01.state +53 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-sb-01.cfg +118 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/demo-sb-02.cfg +99 -0
- lyss-0.8.0/src/lyss/sim/labs/demo/lab.yaml +144 -0
- lyss-0.8.0/src/lyss/sim/render.py +445 -0
- lyss-0.8.0/src/lyss/sim/server.py +437 -0
- lyss-0.8.0/src/lyss/sites.py +162 -0
- lyss-0.8.0/src/lyss/topology.py +303 -0
- lyss-0.8.0/src/lyss/vault.py +109 -0
- lyss-0.8.0/src/lyss/web/__init__.py +2 -0
- lyss-0.8.0/src/lyss/web/app.py +996 -0
- lyss-0.8.0/src/lyss/web/static/app.js +139 -0
- lyss-0.8.0/src/lyss/web/static/favicon.svg +9 -0
- lyss-0.8.0/src/lyss/web/static/firmware.js +19 -0
- lyss-0.8.0/src/lyss/web/static/maroc.svg +25 -0
- lyss-0.8.0/src/lyss/web/static/remediation.js +57 -0
- lyss-0.8.0/src/lyss/web/static/style.css +382 -0
- lyss-0.8.0/src/lyss/web/static/topology.js +290 -0
- lyss-0.8.0/src/lyss/web/static/zellige.svg +18 -0
- lyss-0.8.0/src/lyss/web/templates/_hero.html +14 -0
- lyss-0.8.0/src/lyss/web/templates/_macros.html +16 -0
- lyss-0.8.0/src/lyss/web/templates/backup_diff.html +22 -0
- lyss-0.8.0/src/lyss/web/templates/base.html +47 -0
- lyss-0.8.0/src/lyss/web/templates/dashboard.html +163 -0
- lyss-0.8.0/src/lyss/web/templates/device.html +147 -0
- lyss-0.8.0/src/lyss/web/templates/device_form.html +78 -0
- lyss-0.8.0/src/lyss/web/templates/discovery.html +110 -0
- lyss-0.8.0/src/lyss/web/templates/firmware.html +79 -0
- lyss-0.8.0/src/lyss/web/templates/login.html +20 -0
- lyss-0.8.0/src/lyss/web/templates/matrix.html +48 -0
- lyss-0.8.0/src/lyss/web/templates/remediation.html +96 -0
- lyss-0.8.0/src/lyss/web/templates/report.html +154 -0
- lyss-0.8.0/src/lyss/web/templates/settings.html +270 -0
- lyss-0.8.0/src/lyss/web/templates/setup.html +22 -0
- lyss-0.8.0/src/lyss/web/templates/topology.html +45 -0
- lyss-0.8.0/src/lyss.egg-info/PKG-INFO +210 -0
- lyss-0.8.0/src/lyss.egg-info/SOURCES.txt +141 -0
- lyss-0.8.0/src/lyss.egg-info/dependency_links.txt +1 -0
- lyss-0.8.0/src/lyss.egg-info/entry_points.txt +2 -0
- lyss-0.8.0/src/lyss.egg-info/requires.txt +14 -0
- lyss-0.8.0/src/lyss.egg-info/top_level.txt +1 -0
- lyss-0.8.0/tests/cases/hp-config-only/expected.yaml +15 -0
- lyss-0.8.0/tests/cases/hp-hardened/config.cfg +43 -0
- lyss-0.8.0/tests/cases/hp-hardened/expected.yaml +25 -0
- lyss-0.8.0/tests/cases/hp-hardened/state.txt +92 -0
- lyss-0.8.0/tests/cases/hp-weak/config.cfg +15 -0
- lyss-0.8.0/tests/cases/hp-weak/expected.yaml +26 -0
- lyss-0.8.0/tests/cases/hp-weak/state.txt +47 -0
- lyss-0.8.0/tests/cases/ios-hardened/config.cfg +52 -0
- lyss-0.8.0/tests/cases/ios-hardened/expected.yaml +25 -0
- lyss-0.8.0/tests/cases/ios-hardened/state.txt +36 -0
- lyss-0.8.0/tests/cases/ios-weak/config.cfg +25 -0
- lyss-0.8.0/tests/cases/ios-weak/expected.yaml +25 -0
- lyss-0.8.0/tests/cases/ios-weak/state.txt +23 -0
- lyss-0.8.0/tests/cases/mikrotik-hardened/config.cfg +31 -0
- lyss-0.8.0/tests/cases/mikrotik-hardened/expected.yaml +27 -0
- lyss-0.8.0/tests/cases/mikrotik-hardened/state.txt +67 -0
- lyss-0.8.0/tests/cases/mikrotik-v6/config.cfg +7 -0
- lyss-0.8.0/tests/cases/mikrotik-v6/expected.yaml +10 -0
- lyss-0.8.0/tests/cases/mikrotik-v6/state.txt +17 -0
- lyss-0.8.0/tests/cases/mikrotik-weak/config.cfg +13 -0
- lyss-0.8.0/tests/cases/mikrotik-weak/expected.yaml +26 -0
- lyss-0.8.0/tests/cases/mikrotik-weak/state.txt +60 -0
- lyss-0.8.0/tests/cases/sb-config-only/expected.yaml +14 -0
- lyss-0.8.0/tests/cases/sb-hardened/config.cfg +52 -0
- lyss-0.8.0/tests/cases/sb-hardened/expected.yaml +25 -0
- lyss-0.8.0/tests/cases/sb-hardened/state.txt +56 -0
- lyss-0.8.0/tests/cases/sb-weak/config.cfg +22 -0
- lyss-0.8.0/tests/cases/sb-weak/expected.yaml +25 -0
- lyss-0.8.0/tests/cases/sb-weak/state.txt +39 -0
- lyss-0.8.0/tests/cases/sonic-hardened/config.cfg +43 -0
- lyss-0.8.0/tests/cases/sonic-hardened/expected.yaml +26 -0
- lyss-0.8.0/tests/cases/sonic-hardened/state.txt +46 -0
- lyss-0.8.0/tests/cases/sonic-weak/config.cfg +33 -0
- lyss-0.8.0/tests/cases/sonic-weak/expected.yaml +26 -0
- lyss-0.8.0/tests/cases/sonic-weak/state.txt +48 -0
- lyss-0.8.0/tests/conftest.py +58 -0
- lyss-0.8.0/tests/test_attribution.py +31 -0
- lyss-0.8.0/tests/test_changes.py +128 -0
- lyss-0.8.0/tests/test_ciso_library.py +182 -0
- lyss-0.8.0/tests/test_controls.py +120 -0
- lyss-0.8.0/tests/test_firmware.py +131 -0
- lyss-0.8.0/tests/test_integrations.py +226 -0
- lyss-0.8.0/tests/test_jump_source.py +104 -0
- lyss-0.8.0/tests/test_mikrotik.py +142 -0
- lyss-0.8.0/tests/test_notify.py +93 -0
- lyss-0.8.0/tests/test_private.py +49 -0
- lyss-0.8.0/tests/test_remediate.py +301 -0
- lyss-0.8.0/tests/test_review_fixes.py +138 -0
- lyss-0.8.0/tests/test_sim.py +177 -0
- lyss-0.8.0/tests/test_sites.py +113 -0
- lyss-0.8.0/tests/test_sonic.py +79 -0
- lyss-0.8.0/tests/test_spec.py +38 -0
- lyss-0.8.0/tests/test_units.py +262 -0
- lyss-0.8.0/tests/test_wazuh_dashboard.py +48 -0
- lyss-0.8.0/tests/test_wazuh_rules.py +83 -0
- lyss-0.8.0/tests/test_web.py +157 -0
lyss-0.8.0/CHANGELOG.md
ADDED
|
@@ -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.
|