-
-
Couldn't load subscription status.
- Fork 53
Description
Qubes OS release
Qubes OS 4.2
Brief summary
Yesterday I was editing some firewall rules, then later noticed that newly launched qubes were unable to reach the internet. I discovered that the qubes-firewall service had crashed.
Steps to reproduce
- Update firewall rules in qube settings
- Probably some unlucky IO timing?
Expected behavior
Firewall keeps updating as rules are changed and new qubes are started.
Actual behavior
qubes-firewall crashed: found in sys-firewall journalctl -u qubes-firewall.service
Feb 07 14:52:47 sys-firewall python3[570]: detected unhandled Python exception in '/usr/bin/qubes-firewall'
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: Traceback (most recent call last):
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/bin/qubes-firewall", line 5, in <module>
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: sys.exit(main())
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: ^^^^^^
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 638, in main
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: worker.main()
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 353, in main
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: self.handle_addr(source_addr)
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 295, in handle_addr
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: self.apply_rules(addr, rules)
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 598, in apply_rules
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: self.apply_rules_family(source, rules, 4)
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 590, in apply_rules_family
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: is_blocked = self.is_blocked(rules, con, dns)
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: File "/usr/lib/python3.12/site-packages/qubesagent/firewall.py", line 254, in is_blocked
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: if int(con_dport) != 53 or not con_dst in dns_servers:
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: ^^^^^^^^^^^^^^
Feb 07 14:52:47 sys-firewall qubes-firewall[570]: ValueError: invalid literal for int() with base 10: '5conntrack'
Feb 07 14:52:47 sys-firewall systemd[1]: qubes-firewall.service: Main process exited, code=exited, status=1/FAILURE
Feb 07 14:52:47 sys-firewall systemd[1]: qubes-firewall.service: Failed with result 'exit-code'.
Additional information
If I followed the code correctly, it seems like qubes-firewall must have read dport=5conntrack in the output of conntrack. The only place "conntrack" normally appears in the output of conntrack is in the message conntrack v1.4.7 (conntrack-tools): ... printed to stderr before exiting. So that message probably ended up interleaved with normal output such as dport=53.
Two things look suspicious to me, and I'd be happy to change them if desired:
stderr=subprocess.STDOUTcombines stderr with stdout - but that risks interleaving like this, and probably nothing printed to stderr is usefully parseable anyway.- The
int()call has no ValueError handling - although a better handling isn't entirely obvious.