logo

Database

Insecure exceptions - Empty or no catch

Need

Proper exception handling and error management

Context

• Usage of Java 8 for developing applications with enhanced features and performance

• Usage of javax.servlet-api for Java Servlet development

Description

1. Non compliant code

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class VulnerableServlet extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) {
        try {
            String param = request.getParameter("param");...

The above code snippet contains a `doGet` method in a `VulnerableServlet` class which extends `HttpServlet`. This method attempts to retrieve a parameter from a request and parse it to an integer. This operation can potentially throw a `NumberFormatException` if the parameter is not a valid integer. The problem lies in the `catch` block. It is designed to catch any `Exception` that might be thrown within the `try` block. However, the `catch` block is empty, meaning that if an exception is thrown, the application will not perform any actions to handle the error. This lack of error handling can lead to several issues: 1. **Unavailability of the Application:** If an exception is thrown, the application might become temporarily or permanently unavailable, depending on the severity of the exception. 2. **Loss of Diagnostic Information:** When an exception is caught and not handled or logged, valuable information about what went wrong in the application is lost. 3. **Unexpected Behavior:** The application might behave unexpectedly if an exception is thrown and not properly handled. This could lead to further errors down the line. To fix this vulnerability, the `catch` block should be updated to properly handle the exception. This could include logging the error, sending a response to the user indicating an error occurred, or even re-throwing the exception to be handled at a higher level.

2. Steps

• Add proper exception handling code within the catch block

• Handle the exception appropriately, such as logging the error or providing a user-friendly error message

• Consider using specific exception types instead of catching generic Exception

• Ensure that the application remains functional even when exceptions occur

3. Secure code example

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.logging.Level;
import java.util.logging.Logger;

public class SecureServlet extends HttpServlet {
...

The above code fixes the vulnerability by adding proper exception handling within the catch block. Firstly, a `Logger` instance is created to log any exceptions that occur. This is useful for debugging and identifying issues in the application. In the `doGet` method, the code that could potentially throw an exception is wrapped in a `try` block. If an exception occurs, it is caught and handled appropriately. Two types of exceptions are caught: `NumberFormatException` and a generic `Exception`. The `NumberFormatException` is thrown by the `Integer.parseInt` method if the provided string cannot be parsed to an integer. If this occurs, the error is logged and a user-friendly error message is sent as a response with a 400 (Bad Request) status code. The generic `Exception` is a catch-all for any other exceptions that might occur. If such an exception is thrown, the error is logged and a user-friendly error message is sent as a response with a 500 (Internal Server Error) status code. By handling exceptions in this way, the application remains functional even when exceptions occur, and provides useful feedback to the user and developers.