CodeQL 文档

将套接字绑定到所有网络接口

ID: py/bind-socket-all-network-interfaces
Kind: problem
Security severity: 6.5
Severity: error
Precision: high
Tags:
   - security
   - external/cwe/cwe-200
Query suites:
   - python-code-scanning.qls
   - python-security-extended.qls
   - python-security-and-quality.qls

点击查看 CodeQL 仓库中的查询

套接字可用于与网络上的其他机器通信。您可以使用 (IP 地址,端口) 对来定义您创建的套接字的访问限制。当使用内置的 Python socket 模块时(例如,当构建消息发送器服务或 FTP 服务器数据传输器时),您必须将端口绑定到某个接口。当您使用 0.0.0.0 作为 IP 地址将端口绑定到所有接口时,您实际上允许它接受来自任何 IPv4 地址的连接,前提是它可以通过路由到达套接字。因此,绑定到所有接口与安全风险相关联。

建议

仅将服务传入流量绑定到专用接口。如果您需要使用内置的 socket 模块绑定多个接口,请创建多个套接字(而不是将一个套接字绑定到所有接口)。

示例

在此示例中,两个套接字不安全,因为它们绑定到所有接口;一个通过 0.0.0.0 符号,另一个通过空字符串 ''

import socket

# binds to all interfaces, insecure
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 31137))

# binds to all interfaces, insecure
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('', 4040))

# binds only to a dedicated interface, secure
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('84.68.10.12', 8080))

参考资料

  • ©GitHub, Inc.
  • 条款
  • 隐私