Execution After Redirect ('EAR')
ID |
java.execution_after_redirect |
Severity |
low |
Resource |
Other |
Language |
Java |
Tags |
CWE:698, NIST.SP.800-53 |
Description
Execution after redirect ('EAR') occurs when web application logic allows further processing of a request after an HTTP redirect is intended. In such scenarios, subsequent code execution could inadvertently expose sensitive information or bypass access controls, posing a security risk.
Rationale
Execution After Redirect vulnerabilities typically arise when programmers assume that code execution halts after an HTTP redirect.
In reality, most web frameworks allow further execution after a redirect unless explicitly stopped. This can lead to security weaknesses, such as subsequent actions that should be conditional upon the redirect.
Below is a simple example illustrating this issue in Java using servlets:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (!isUserAuthenticated(request)) {
response.sendRedirect("/login");
// Further code execution should cease here.
}
// Code below will still execute even after redirect
printSensitiveInformation(response);
}
private boolean isUserAuthenticated(HttpServletRequest request) {
// Authentication logic
return false; // Represents an unauthenticated user for demonstration
}
private void printSensitiveInformation(HttpServletResponse response) throws IOException {
// Simulates displaying sensitive information
response.getWriter().println("Sensitive information");
}
In this example, the developer likely intended for the printSensitiveInformation
method not to execute if the user is redirected to the login page. However, the execution proceeds, causing security risks by potentially exposing sensitive details.
Remediation
To remediate this vulnerability, ensure that the code logic explicitly stops processing after an HTTP redirect.
In Java, this can be accomplished by returning from the method immediately following a redirect. Here is how you can refactor the above code to prevent further execution:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
if (!isUserAuthenticated(request)) {
response.sendRedirect("/login");
return; // Stop further processing
}
// Code below will not execute if a redirect occurs
printSensitiveInformation(response);
}
By adding the return
statement immediately following the redirect, you effectively terminate further execution in the current method scope.
Furthermore, consider adopting an overarching framework or middleware solutions that automatically handle the execution flow by halting operations post-redirect, thereby reducing the risk of oversight by individual developers.
As a best practice, regularly review code paths that perform HTTP redirects to ensure they comply with security guidelines and do not inadvertently continue execution inappropriately.