Skip to content

SonarCloud-Demos/sonar-showcase

Repository files navigation

SonarShowcase

A demonstration monolith application (Spring Boot + React/TypeScript) designed to showcase SonarCloud's static analysis capabilities.

⚠️ WARNING: This application intentionally contains security vulnerabilities, bugs, and code smells for educational purposes. DO NOT use in production!

🎯 Purpose & Disclaimer

This is a dummy/demo application created exclusively for showcasing SonarQube/SonarCloud capabilities.

This application is NOT intended to be a functional e-commerce platform. It is a training and demonstration tool that:

  • βœ… Demonstrates how SonarQube detects security vulnerabilities, bugs, and code smells
  • βœ… Provides realistic code examples for learning static analysis
  • βœ… Showcases SonarQube's ability to identify issues across multiple languages (Java, TypeScript)
  • ❌ Should NEVER be deployed to production environments
  • ❌ Is NOT a secure or functional application
  • ❌ Does NOT follow security or coding best practices (intentionally)

All vulnerabilities, bugs, and poor coding practices in this codebase are intentional and documented for educational purposes.

Architecture

This is a monolith architecture where:

  • Backend: Spring Boot (Java 21) serves both API endpoints and the React frontend
  • Frontend: React/TypeScript built with Vite, packaged as static resources in the JAR
  • Database: PostgreSQL
  • SPA Routing: All non-API requests are forwarded to index.html to enable client-side routing (handled by SpaController)
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   Single JAR Deployment                  β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚
β”‚  β”‚              Spring Boot Application                β”‚β”‚
β”‚  β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”‚β”‚
β”‚  β”‚  β”‚   REST API      β”‚    β”‚   Static Resources      β”‚β”‚β”‚
β”‚  β”‚  β”‚   /api/v1/*     β”‚    β”‚   (React SPA)           β”‚β”‚β”‚
β”‚  β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”‚
β”‚                            β”‚                             β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                             β–Ό
                      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                      β”‚  PostgreSQL β”‚
                      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Project Structure

sonar-demo/
β”œβ”€β”€ pom.xml                    # Parent Maven POM
β”œβ”€β”€ Dockerfile                 # Multi-stage build for monolith
β”œβ”€β”€ docker-compose.yml         # PostgreSQL + App
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ pom.xml                # Backend module (depends on frontend)
β”‚   └── src/
β”‚       β”œβ”€β”€ main/java/         # Java source code
β”‚       └── test/java/         # Java tests
β”œβ”€β”€ frontend/
β”‚   β”œβ”€β”€ pom.xml                # Frontend module (builds React app)
β”‚   β”œβ”€β”€ package.json
β”‚   β”œβ”€β”€ vite.config.ts
β”‚   └── src/                   # React/TypeScript source
└── malicious-attic/
    β”œβ”€β”€ pom.xml                # Test module for supply chain security scanning
    β”œβ”€β”€ package.json            # Contains malicious npm packages for demo
    └── package-lock.json      # Lockfile with malicious dependencies

Quick Start

Prerequisites

  • Docker & Docker Compose
  • Java 21+ (for local development)
  • Node.js 24+ (for local development)
  • Maven 3.9+ (for local development)

Running with Docker (Recommended)

# Start the full stack (PostgreSQL + Monolith App)
docker-compose up -d

# Wait for services to start (takes 1-2 minutes)
# Application: http://localhost:8080
# API Health:  http://localhost:8080/api/v1/health

Running Locally

  1. Start PostgreSQL:
docker-compose up -d postgres
  1. Build and run the monolith:
# From the project root
mvn clean install
cd backend
mvn spring-boot:run
  1. For frontend development with hot reload:
# In a separate terminal
cd frontend
npm install
npm run dev
# Frontend dev server: http://localhost:3000 (proxies API to :8080)

Building the Application

Full Build (Backend + Frontend + Documentation)

Running mvn clean install will automatically:

  • Build the frontend React application
  • Generate TypeDoc documentation for frontend
  • Build the backend Spring Boot application
  • Generate JavaDoc documentation for backend
  • Package everything into JARs

Full Build (Backend + Frontend)

# Build everything from the root
mvn clean package

# The executable JAR is at: backend/target/sonarshowcase-backend-1.2.0-SNAPSHOT.jar

Skip Frontend Build

# Build only backend (requires frontend to be pre-built)
mvn clean package -Dfrontend-maven-plugin.skip=true

Running SonarCloud Analysis

Analysis is performed against SonarCloud. No local SonarQube instance is needed.

Prerequisites

  1. Create a project on SonarCloud
  2. Generate a token: Account β†’ Security β†’ Generate Tokens
  3. Set the token as an environment variable:
export SONAR_TOKEN=your_token_here

Analyze with Maven

# Build with tests and coverage, then analyze
mvn clean verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar

# Or analyze without rebuilding
mvn sonar:sonar

Analyze with sonar-scanner (Alternative)

# Install sonar-scanner if not already installed
# npm install -g sonar-scanner

# Run from project root
sonar-scanner -Dsonar.token=$SONAR_TOKEN

View Results

Open your project on SonarCloud to explore the analysis results.

Documentation

Automatic Documentation Generation

Documentation is automatically generated during the Maven build:

  • JavaDoc (Backend): Generated during build β†’ backend/target/site/apidocs/
  • TypeDoc (Frontend): Generated during build β†’ frontend/target/site/typedoc/

Simply run:

mvn clean install

Both documentation sets will be created automatically.

View documentation:

# Backend JavaDoc
open backend/target/site/apidocs/index.html

# Frontend TypeDoc
open frontend/target/site/typedoc/index.html

See docs/AUTOMATED_DOCUMENTATION.md for details on how documentation is generated.

Interactive API Documentation (Swagger UI)

The application includes automatically generated API documentation using SpringDoc OpenAPI:

The documentation is automatically generated from the code and includes:

  • All REST API endpoints (43 endpoints across 11 controllers)
  • Request/response schemas
  • Parameter descriptions with examples
  • Security warnings for vulnerable endpoints
  • Response codes and descriptions

Controllers: HealthController, UserController, OrderController, ActivityLogController, FileController, AuthController, XmlController, ProxyController, SystemController, DataImportController, ValidationController

Note: The documentation is generated at runtime. Start the application to access it.

Testing Guide: See docs/SWAGGER_TESTING.md for detailed instructions on testing Swagger UI and verifying all endpoints.

Specification Documents

For detailed specifications and requirements:

  • Application Specification: docs/SPECIFICATION.md - Complete specification of application behavior
  • SonarQube Rules Mapping: docs/SONARQUBE_RULES_MAPPING.md - Central mapping of all 300+ issues to SonarQube rules
  • How to Fix Guide: docs/HOW_TO_FIX.md - Before/after code examples showing how to fix vulnerabilities
  • API Reference Card: docs/API_REFERENCE_CARD.md - Quick reference for all endpoints
  • Business Logic: docs/business-logic.md - Business flows and rules
  • Automated Documentation: docs/AUTOMATED_DOCUMENTATION.md - How JavaDoc/TypeDoc are generated during build
  • Local Development: docs/LOCAL_DEVELOPMENT.md - Development setup guide
  • AI Assistant Guide: docs/AI_ASSISTANT_GUIDE.md - Guide for AI assistants working on this codebase

Scanner Configuration

This project uses a hybrid configuration approach for SonarQube scanning:

  1. Maven Auto-Detection (sonar.maven.scanAll=True in parent pom.xml):

    • SonarQube automatically detects Maven modules (backend, frontend, and malicious-attic)
    • Module-specific properties are defined in each module's pom.xml under <properties>
  2. Module-Specific Properties:

    • Backend (backend/pom.xml): Uses standard Maven Java structure

      • Sources: src/main/java
      • Tests: src/test/java
      • Coverage: JaCoCo XML report at target/site/jacoco/jacoco.xml
    • Frontend (frontend/pom.xml): Custom TypeScript/JavaScript configuration

      • Sources: src (TypeScript/JavaScript files)
      • Tests: test directory
      • Test inclusions: **/*.test.ts, **/*.test.tsx
      • Exclusions: **/node_modules/**, **/dist/**, **/build/**, config files
      • Coverage: LCOV report at coverage/lcov.info
    • Malicious Attic (malicious-attic/pom.xml): Test module for supply chain security scanning

      • Packaging: pom (not built by Maven, exists only for SonarQube scanning)
      • Sources: . (package.json and package-lock.json)
      • Contains malicious npm packages for supply chain vulnerability detection
      • Exclusions: **/node_modules/**, **/dist/**, **/build/**, config files
  3. Global Configuration (Optional):

    • If not using Maven, you can create a sonar-project.properties file with:
      • Project identification (key, name, organization)
      • Module definitions
    • Note: Maven auto-detection is the primary method and takes precedence (all configuration is in pom.xml)

Key Point: The frontend module's source paths are explicitly configured in frontend/pom.xml because it doesn't follow Maven's standard Java directory structure. Without these properties, SonarQube would only index pom.xml instead of the TypeScript/JavaScript source files.

API Endpoints

Core Endpoints

Method Endpoint Description
GET /api/v1/health Health check
GET /api/v1/info System information (⚠️ exposes sensitive data)
GET /api/v1/users Get all users
GET /api/v1/users/{id} Get user by ID
GET /api/v1/users/search?q={query} Search users (in-memory search)
POST /api/v1/users Create user
PUT /api/v1/users/{id}/password Update password (⚠️ insecure)
DELETE /api/v1/users/{id} Delete user
GET /api/v1/orders Get all orders
GET /api/v1/orders/{id} Get order by ID
GET /api/v1/orders/user/{userId} Get orders by user ID
POST /api/v1/orders Create order
POST /api/v1/orders/{id}/discount?code={code} Apply discount code
GET /api/v1/activity-logs Get all activity logs
GET /api/v1/activity-logs/user/{userId} Get activity logs by user ID
POST /api/v1/activity-logs Create activity log

Vulnerable Endpoints (Security Demo)

SQL Injection

Method Endpoint Vulnerability
GET /api/v1/users/login?username=X&password=Y πŸ”΄ SQL Injection
GET /api/v1/users/vulnerable-search?term=X πŸ”΄ SQL Injection
GET /api/v1/users/sorted?orderBy=X πŸ”΄ SQL Injection (ORDER BY)
GET /api/v1/users/with-limit?limit=X πŸ”΄ SQL Injection (LIMIT)
POST /api/v1/users/insert-unsafe πŸ”΄ SQL Injection (INSERT)
PUT /api/v1/users/{id}/email-unsafe πŸ”΄ SQL Injection (UPDATE)
GET /api/v1/activity-logs/search?startDate=X&endDate=Y&userId=Z πŸ”΄ SQL Injection

Path Traversal

Method Endpoint Vulnerability
GET /api/v1/files/download?filename=X πŸ”΄ Path Traversal
GET /api/v1/files/read?path=X πŸ”΄ Path Traversal
GET /api/v1/files/profile?username=X πŸ”΄ Path Traversal
GET /api/v1/files/logs?date=X πŸ”΄ Path Traversal
GET /api/v1/files/template?name=X πŸ”΄ Path Traversal (Template Inclusion)
POST /api/v1/files/export?filename=X πŸ”΄ Path Traversal (Write)
POST /api/v1/files/extract?zipPath=X&destDir=Y πŸ”΄ Zip Slip Vulnerability
DELETE /api/v1/files/delete?filename=X πŸ”΄ Path Traversal (Delete)

XXE Injection

Method Endpoint Vulnerability
POST /api/v1/xml/parse πŸ”΄ XXE Injection
POST /api/v1/xml/config πŸ”΄ XXE Injection

SSRF

Method Endpoint Vulnerability
GET /api/v1/proxy/fetch?url=X πŸ”΄ SSRF
POST /api/v1/proxy/webhook?webhookUrl=X πŸ”΄ SSRF
GET /api/v1/proxy/image?imageUrl=X πŸ”΄ SSRF

Command Injection

Method Endpoint Vulnerability
GET /api/v1/system/ping?host=X πŸ”΄ Command Injection
GET /api/v1/system/dns?domain=X πŸ”΄ Command Injection
POST /api/v1/system/compress?filename=X πŸ”΄ Command Injection

Insecure Deserialization

Method Endpoint Vulnerability
POST /api/v1/data/import πŸ”΄ Insecure Deserialization (RCE)
POST /api/v1/data/session/restore πŸ”΄ Insecure Deserialization

ReDoS

Method Endpoint Vulnerability
GET /api/v1/validate/email?input=X πŸ”΄ ReDoS
GET /api/v1/validate/url?url=X πŸ”΄ ReDoS
GET /api/v1/validate/password?password=X πŸ”΄ ReDoS

JWT Vulnerabilities

Method Endpoint Vulnerability
POST /api/v1/auth/login πŸ”΄ Weak JWT secret, No expiration
GET /api/v1/auth/verify πŸ”΄ Accepts "none" algorithm

LDAP Injection

Method Endpoint Vulnerability
GET /api/v1/users/ldap-search?username=X πŸ”΄ LDAP Injection

Example Requests

# Health check
curl http://localhost:8080/api/v1/health

# Get all users
curl http://localhost:8080/api/v1/users

# Create a user
curl -X POST http://localhost:8080/api/v1/users \
  -H "Content-Type: application/json" \
  -d '{"username": "johndoe", "email": "[email protected]", "password": "password123"}'

Intentional Issues for SonarCloud Demo

This application contains 300+ intentional issues across three categories to demonstrate SonarQube's comprehensive analysis capabilities:

Security (70+ critical security vulnerabilities)

Vulnerability Categories:

  • πŸ”΄ SQL Injection - 10+ instances across UserController, ActivityLogController, and repository implementations
  • πŸ”΄ Path Traversal - 8 endpoints in FileController allowing arbitrary file access
  • πŸ”΄ XXE Injection - 2 endpoints processing unsafe XML
  • πŸ”΄ SSRF - 3 endpoints allowing server-side request forgery
  • πŸ”΄ Command Injection - 3 endpoints with OS command injection
  • πŸ”΄ Insecure Deserialization - 2 endpoints vulnerable to RCE
  • πŸ”΄ ReDoS - 3 endpoints with catastrophic backtracking patterns
  • πŸ”΄ JWT Vulnerabilities - Weak secrets, no expiration, accepts "none" algorithm
  • πŸ”΄ LDAP Injection - Unsafe LDAP queries
  • πŸ”΄ Supply Chain - 4 malicious npm packages + vulnerable dependencies
  • πŸ”΄ Other - Hardcoded credentials, XSS, weak crypto, CORS wildcard

SQL Injection (S3649) - 10+ instances

Endpoint Attack Vector Description
GET /api/v1/users/login username=admin'-- Authentication bypass via SQL comment
GET /api/v1/users/vulnerable-search term=' UNION SELECT... Data extraction via UNION injection
GET /api/v1/users/sorted orderBy=username; DROP TABLE ORDER BY clause injection
GET /api/v1/users/with-limit limit=1; DROP TABLE users;-- LIMIT clause injection
POST /api/v1/users/insert-unsafe username=admin'); DROP TABLE-- INSERT statement injection
PUT /api/v1/users/{id}/email-unsafe email=x', role='ADMIN' WHERE '1'='1 UPDATE statement injection
GET /api/v1/activity-logs/search startDate=2025-01-01' OR '1'='1'-- Date range bypass via SQL injection
GET /api/v1/activity-logs/search userId=1' UNION SELECT * FROM users-- Data extraction via UNION injection
UserRepositoryCustomImpl Internal methods SQL concat in findUsersBySearch, authenticateUser, insertUserUnsafe, updateUserEmailUnsafe
ActivityLogService getActivityLogsByDateRange() Clear source-to-sink path: HTTP params β†’ Service β†’ SQL

Path Traversal (S2083)

Endpoint Attack Vector Description
GET /api/v1/files/download filename=../../../etc/passwd Read arbitrary files
GET /api/v1/files/read path=/etc/passwd Direct file read
GET /api/v1/files/profile username=../../../etc/passwd Profile path manipulation
GET /api/v1/files/logs date=2025/../../../etc/shadow Log date injection
POST /api/v1/files/export filename=../../../tmp/pwned Write arbitrary files
DELETE /api/v1/files/delete filename=../../../important Delete arbitrary files

XML External Entity (XXE) Injection (S2755, S4829)

Endpoint Attack Vector Description
POST /api/v1/xml/parse <!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]> Read arbitrary files via XXE
POST /api/v1/xml/config XXE in configuration upload Read files, SSRF, DoS

Server-Side Request Forgery (SSRF) (S5144)

Endpoint Attack Vector Description
GET /api/v1/proxy/fetch url=http://localhost:8080/actuator Access internal services
GET /api/v1/proxy/fetch url=http://169.254.169.254/latest/meta-data/ Access cloud metadata
POST /api/v1/proxy/webhook Internal webhook URLs Test webhooks against internal services
GET /api/v1/proxy/image Internal image URLs Scan internal network

Command Injection (S2076, S4823)

Endpoint Attack Vector Description
GET /api/v1/system/ping host=google.com; cat /etc/passwd Command chaining
GET /api/v1/system/ping `host=google.com whoami`
GET /api/v1/system/dns domain=example.com; rm -rf / DNS lookup injection
POST /api/v1/system/compress Shell injection in tar command Arbitrary command execution

Insecure Deserialization (S5135)

Endpoint Attack Vector Description
POST /api/v1/data/import Malicious serialized object (ysoserial) Remote Code Execution (RCE)
POST /api/v1/data/session/restore Malicious session object RCE via deserialization

Regular Expression Denial of Service (ReDoS) (S5852, S6019)

Endpoint Attack Vector Description
GET /api/v1/validate/email aaaaaaaaaaaaaaaaaaaaX Catastrophic backtracking causes CPU exhaustion
GET /api/v1/validate/url Long URL with nested patterns DoS via regex backtracking
GET /api/v1/validate/password Password with repeated chars Nested quantifiers cause exponential time

JWT Vulnerabilities (S5659)

Endpoint Attack Vector Description
POST /api/v1/auth/login Weak secret "weak" Easily brute-forced JWT secret
POST /api/v1/auth/login No expiration time Tokens never expire
GET /api/v1/auth/verify {"alg":"none"} Accepts unsigned tokens (critical)

LDAP Injection (S2078)

Endpoint Attack Vector Description
GET /api/v1/users/ldap-search `username=)(uid=))( (uid=*`
GET /api/v1/users/ldap-search `username=admin)( (password=*))`

Supply Chain Security (SCA)

Malicious Packages (npm):

Module Package Vulnerability ID Description
malicious-attic chai-tests-async MAL-2026-172 Embedded malicious code (CWE-506)
malicious-attic json-mappings MAL-2026-160 Embedded malicious code (CWE-506)
malicious-attic yunxohang10 MAL-2026-182 Embedded malicious code (CWE-506)
malicious-attic jwtdapp MAL-2026-175 Embedded malicious code (CWE-506)

Vulnerable Dependencies (npm):

Module Package Version CVE Description
malicious-attic lodash 4.17.15 CVE-2019-10744 Prototype Pollution
malicious-attic minimist 1.2.5 CVE-2020-7598 Prototype Pollution
malicious-attic yargs-parser 13.1.1 CVE-2020-7608 Prototype Pollution
malicious-attic node-fetch 2.6.0 CVE-2020-15168 Information Disclosure
malicious-attic axios 0.21.1 CVE-2021-3749 SSRF
malicious-attic express 4.17.0 CVE-2022-24999 Open Redirect
malicious-attic moment 2.29.1 CVE-2022-24785 Path Traversal

Vulnerable Dependencies (Maven):

Module Package Version CVE Description
malicious-attic log4j-core 2.14.1 CVE-2021-44228 Log4Shell - Remote Code Execution
malicious-attic spring-beans 5.3.16 CVE-2022-22965 Spring4Shell - Remote Code Execution
malicious-attic jackson-databind 2.10.0 CVE-2020-36518 Deserialization vulnerability
malicious-attic commons-text 1.9 CVE-2022-42889 Text4Shell - RCE via variable interpolation

The malicious-attic module contains intentionally malicious packages and vulnerable dependencies for demonstrating SonarQube's supply chain security analysis capabilities. These packages are flagged in security databases and should trigger security alerts during scanning.

Other Security Issues

  • Hardcoded credentials throughout (PaymentService, DatabaseConfig)
  • XSS via dangerouslySetInnerHTML (CommentDisplay.tsx)
  • Weak cryptography using MD5 (PasswordUtil)
  • CORS wildcard configuration (WebConfig)
  • JWT stored in localStorage (api.ts)

Reliability (10+ issues)

  • Null pointer risks
  • Resource leaks
  • Swallowed exceptions
  • Race conditions
  • Stale closure in useEffect

Maintainability (200+ issues)

  • God class (DataManager.java - 820 lines in util/ package)
  • Extreme cognitive complexity (processComplexBusinessLogic - complexity > 50)
  • Long parameter list (createDetailedReport - 12 parameters)
  • Magic numbers everywhere
  • 'any' type abuse in TypeScript
  • Duplicated validation code
  • Poor naming conventions
  • Console.log spam
  • TODO/FIXME comments
  • Skeleton tests with no assertions
  • Dead code (unreachable statements, unused methods)
  • React anti-patterns (BadPractices.tsx):
    • Missing dependencies in useEffect
    • Array index as key
    • Missing accessibility attributes
    • Poor color contrast
    • Inline functions in JSX

Development

Backend Development

cd backend
./mvnw spring-boot:run

Frontend Development

cd frontend
npm install
npm run dev          # Start dev server with hot reload
npm run test         # Run tests
npm run test:coverage # Run tests with coverage
npm run build        # Production build

Running Tests

# Run all tests
mvn test

# Run only backend tests
mvn test -pl backend

# Run only frontend tests
cd frontend && npm test

License

MIT License


This application is intentionally flawed for educational purposes.

About

Demo project for showcasing Sonar capabilities

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors