Skip to main content

Unrestricted access between network segments

Need

Implementation of network segmentation and access controls

Context

  • Usage of Java 8 for developing applications with enhanced features and performance improvements.
  • Usage of javax.servlet for building Java web applications with servlets
  • Usage of java.io for input and output operations in Java
  • Usage of java.sql for interacting with relational databases in Java
  • Usage of MySQL JDBC Driver for connecting to a MySQL database

Description

Non compliant code

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class DatabaseAccessServlet extends HttpServlet {
private static final String DB_URL = "jdbc:mysql://localhost:3306/myDB";
private static final String USER = "username";
private static final String PASS = "password";

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

try {
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

Statement stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, email FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");

out.println("ID: " + id + ", Name: " + name + ", Email: " + email + "<br>");
}
rs.close();
stmt.close();
conn.close();
} catch(Exception e) {
e.printStackTrace();
}
}
}

The above code represents a Servlet which is part of a Java backend application. This Servlet connects to a database and retrieves data from it. The data is then sent as a response to the client.

The vulnerability in the code is that it does not restrict access between different network segments. This means that an employee can access database servers from the Internet without any restrictions.

The Servlet connects to the database using a JDBC connection with a username and password. The connection details including the database URL, username, and password are hardcoded into the Servlet, which is a security risk.

When the doGet method is called, it establishes a connection to the database, creates a SQL statement, and executes a query to fetch data from the Employees table. The results are then sent back to the client.

The problem here is that there are no restrictions or checks in place to verify the network segment from which the request came. Therefore, any request, regardless of its origin, can access the database and retrieve data.

This lack of restriction between network segments can lead to unauthorized access to sensitive data, data breaches, and other potential security risks.

Steps

  • Implement a network segmentation strategy to restrict access between network segments.
  • Configure firewall rules to only allow necessary traffic between network segments.
  • Use a secure connection method, such as VPN, to access database servers from external networks.
  • Implement access controls and authentication mechanisms to ensure only authorized users can access the database servers.
  • Regularly update and patch the database server software to address any security vulnerabilities.

Compliant code

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
import java.sql.*;

public class DatabaseAccessServlet extends HttpServlet {
private static final String DB_URL = "jdbc:mysql://localhost:3306/myDB";
private static final String USER = "username";
private static final String PASS = "password";

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();

try {
Class.forName("com.mysql.jdbc.Driver");

// Use a secure connection method, such as VPN, to access database servers from external networks.
// Implement access controls and authentication mechanisms to ensure only authorized users can access the database servers.
if(request.isSecure() && request.isUserInRole("authorizedRole")) {
Connection conn = DriverManager.getConnection(DB_URL, USER, PASS);

Statement stmt = conn.createStatement();
String sql;
sql = "SELECT id, name, email FROM Employees";
ResultSet rs = stmt.executeQuery(sql);

while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");

out.println("ID: " + id + ", Name: " + name + ", Email: " + email + "<br>");
}
rs.close();
stmt.close();
conn.close();
} else {
out.println("Unauthorized access");
}
} catch(Exception e) {
e.printStackTrace();
}
}
}

The updated code includes checks to ensure that the connection is secure and that the user is authorized before allowing access to the database.

The request.isSecure() method checks if the request was made using a secure channel, such as HTTPS. This is important when accessing the database from external networks, as it ensures that the data is encrypted during transmission.

The request.isUserInRole("authorizedRole") method checks if the authenticated user is in a specific role. This is part of implementing access controls and authentication mechanisms to ensure only authorized users can access the database servers. The "authorizedRole" should be replaced with the actual role that has the necessary permissions.

If the request is not secure or the user is not authorized, the servlet responds with "Unauthorized access" and does not proceed with the database query.

Remember, these code changes should be part of a larger strategy that includes network segmentation, firewall rules, and regular updates and patches to the database server software.

References