b55c0cb7bb
- LICENSE: MIT © 2026 edgevoid - README: 三层架构/逐字段伪装对照/部署/验证/安全边界/看门狗自启 - 脱敏(filter-repo 全历史): 8.136.202.225→203.0.113.10, .zjipc.cn→.internal.example, 学校DNS→192.0.2.53 - hook.sh 更新为安全形态(FORWARD-only 绑 WAN, 去掉 OUTPUT 全挂断网形态) - router_deploy.sh: SSHPASS 改环境变量注入(明文密码清除) - watchdog.sh 纳入 deploy/(接口变量化) - 内部语境泛化(认证网关/学校DNS/寝室部署备注)
50 lines
1.6 KiB
Python
50 lines
1.6 KiB
Python
"""dnsmsg 单测: qname 提取与畸形防护。"""
|
|
from __future__ import annotations
|
|
|
|
import struct
|
|
import unittest
|
|
|
|
from channel.dnsmsg import parse_qname
|
|
|
|
|
|
def _query(name: str) -> bytes:
|
|
labels = [len(p.encode()) for p in name.split(".")]
|
|
qname = b"".join(
|
|
bytes((labels[i],)) + name.split(".")[i].encode()
|
|
for i in range(len(labels))
|
|
) + b"\x00"
|
|
header = struct.pack("!HHHHHH", 0x1234, 0x0100, 1, 0, 0, 0)
|
|
return header + qname + struct.pack("!HH", 1, 1) # A IN
|
|
|
|
|
|
class DnsMsgTest(unittest.TestCase):
|
|
def test_plain_name(self) -> None:
|
|
self.assertEqual(parse_qname(_query("www.internal.example")), "www.internal.example")
|
|
|
|
def test_upper_mixed_normalized(self) -> None:
|
|
self.assertEqual(parse_qname(_query("WWW.INTERNAL.EXAMPLE")), "www.internal.example")
|
|
|
|
def test_single_label(self) -> None:
|
|
self.assertEqual(parse_qname(_query("router")), "router")
|
|
|
|
def test_too_short(self) -> None:
|
|
self.assertIsNone(parse_qname(b"\x00\x01"))
|
|
|
|
def test_compression_pointer_rejected(self) -> None:
|
|
pkt = bytearray(_query("www.internal.example"))
|
|
pkt[12] = 0xC0 # qname 首字节变压缩指针
|
|
self.assertIsNone(parse_qname(bytes(pkt)))
|
|
|
|
def test_no_terminator(self) -> None:
|
|
pkt = _query("www.internal.example")
|
|
self.assertIsNone(parse_qname(pkt[:-5])) # 切掉 0 结尾和 qtype
|
|
|
|
def test_non_ascii_label(self) -> None:
|
|
pkt = bytearray(_query("www.internal.example"))
|
|
pkt[14] = 0xFF # 标签内容变非法 ascii
|
|
self.assertIsNone(parse_qname(bytes(pkt)))
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|