套接字认证中的竞争条件¶
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
一种常见的模式是与用户建立一个开放的通信通道,然后打开另一个通道(例如传输数据)。但是,如果用户认证是在原始通道而不是备用通道上完成的,那么攻击者可能能够在合法用户之前连接到备用通道。这允许攻击者通过“搭载”任何先前的认证来冒充用户。
建议¶
在为经过身份验证的用户打开备用通道时(例如,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);
}
}
参考¶
常见弱点枚举:CWE-421。