Skip to content

qubes-firewall crashed parsing conntrack output #9760

@coyotebush

Description

@coyotebush

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

  1. Update firewall rules in qube settings
  2. 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:

  1. stderr=subprocess.STDOUT combines stderr with stdout - but that risks interleaving like this, and probably nothing printed to stderr is usefully parseable anyway.
  2. The int() call has no ValueError handling - although a better handling isn't entirely obvious.

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions