Clone this repo:

Branches

  1. 6ac0321 b/163142235 Update README with library and command line usage by Trilok Tourani · 4 years, 9 months ago master
  2. 2f08ea1 b/163138925 Remove extended validation integrator bindings by Trilok Tourani · 4 years, 9 months ago
  3. 64e84a7 b/163138925 Integrate command line module with Extended Validator by Trilok Tourani · 4 years, 9 months ago
  4. 575ff2d Merge "b/163430475 Add missing traversal test classes" by Trilok Tourani · 4 years, 9 months ago
  5. 2e5aaeb b/161441872 Integrate scope validation in extended validator by Trilok Tourani · 4 years, 9 months ago

Annotated OpenAPI Security

This project aids in heightening API designers and developers awareness of the security state of their OpenAPI Specification (OAS) APIs with respect to six of the OWASP top 10 vulnerabilities. This will be accomplished by providing a command line application and a library of security tooling that analyzes the OAS document.

Components

  • oas-cli : The command line tool with the main class to check security validation of specifications.
  • oas-core : The core library with features like parsing, traversing, and validating an OpenAPI Specification.
  • oas-test : This module contains any shared testing implementations like marker interfaces for integration tests.

Command Line Usage

The command line tool can be invoked like:

java -jar api-security-tools.jar --file openApiSpecification.json

It performs:

  • File validation.
  • OpenApi Specification Standard validation.
  • Supported security extensions validation.

If there are any errors in the usage of the extensions, then the error type and message will be shown along with the extension path.

Building and Testing

./gradlew build

This will

  • Compile project.
  • Validate against ErrorProne and CheckStyle.
  • Run both unit and integration tests.
  • Generate code coverage report.

Validator Library

The core library is responsible to traverse a YAML or JSON document and search for extensions. Every Extension can then be validated using custom validators.

An example is shown below.

Let's start by configuring the guice dependencies.

/**
 * Guice module that installs all required bindings.
 */
public class MainModule extends AbstractModule {

  @Override
  protected void configure() {
    install(new ExtendedValidatorMainModule());
    install(new BaseParserModule());
    binder().requireExplicitBindings();
  }
}

Create a simple validator that implements ExtensionValidator

class CustomValidator implements ExtensionValidator {

    public CustomValidator() {}

    @Override
    public ImmutableSet<ExtensionValidationMessage> validate(Extension extension) {
        // validation logic
        // extension.getExtensionPath(), extension.getExtensionContent(), extension.getExtensionName()
    }
}

Inject the required dependencies into your class.

public class ExtensionValidationExample {
    
    private BaseParser baseParser;
    private ExtendedValidator extendedValidator;
    private TraversalHelperFactory traversalHelperFactory;

    @Inject
    ExtensionValidationExample(BaseParser baseParser, 
                               ExtendedValidator extendedValidator,
                               TraversalHelperFactory traversalHelperFactory) {
        this.baseParser =baseParser;
        this.extendedValidator = extendedValidator;
        this.traversalHelperFactory = traversalHelperFactory;
    }

    void validate(File file) {
        OpenApi3 openApi = baseParser.parse(file);

        // Send traversal command for openapi object
        TraversalHelper traversalHelper = traversalHelperFactory.create(ImmutableList.of());
        traversalHelper.sendOpenApiTraversal(openApiSpec);
        ImmutableSet<Extension> extensions = traversalHelper.traverse()
        
        CustomValidator customValidator = new CustomValidator();

        // Validate an extension
        if(!extensions.isEmpty()) {
            ImmutableSet<ExtensionValidationMessage> errors = extensions.iterator().next().validate(customValidator);
            System.out.println("Found %d extension validation errors.\n\n", errors.size());
        }
    }
}

Run it using:

ExtensionValidationExample extensionValidation = Guice.createInjector(new MainModule()).getInstance(ExtensionValidationExample.class);
extensionValidation.validate(file);

LICENSE

Copyright 2020 Google LLC.

Licensed under the Apache License, Version 2.0