CodeQL 文档

套接字认证中的竞争条件

ID: java/socket-auth-race-condition
Kind: problem
Security severity: 7.2
Severity: warning
Precision: medium
Tags:
   - security
   - external/cwe/cwe-421
Query suites:
   - java-security-extended.qls
   - java-security-and-quality.qls

单击以查看 CodeQL 存储库中的查询

一种常见的模式是与用户建立一个开放的通信通道,然后打开另一个通道(例如传输数据)。但是,如果用户认证是在原始通道而不是备用通道上完成的,那么攻击者可能能够在合法用户之前连接到备用通道。这允许攻击者通过“搭载”任何先前的认证来冒充用户。

建议

在为经过身份验证的用户打开备用通道时(例如,Java Socket),务必通过新通道对用户进行身份验证。

示例

此示例展示了为用户打开连接的两种方法。在第一个示例中,身份验证基于用户已提供的资料(例如,其用户名和/或密码)确定,然后打开新通道。但是,不会通过新通道进行任何身份验证,因此攻击者可以在用户连接之前连接到该通道。

在第二个示例中,身份验证通过套接字通道本身进行,这会验证新连接的用户实际上是预期的用户。

public void doConnect(int desiredPort, String username) {
	ServerSocket listenSocket = new ServerSocket(desiredPort);

	if (isAuthenticated(username)) {
		Socket connection1 = listenSocket.accept();
		// BAD: no authentication over the socket connection
		connection1.getOutputStream().write(secretData);
	}
}

public void doConnect(int desiredPort, String username) {
	ServerSocket listenSocket = new ServerSocket(desiredPort);

	Socket connection2 = listenSocket.accept();
	// GOOD: authentication happens over the socket
	if (doAuthenticate(connection2, username)) {
		connection2.getOutputStream().write(secretData);
	}
}

参考

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