Undefined Scope 'securityScheme' On Global 'security' Field

  • Query id: 23a9e2d9-8738-4556-a71c-2802b6ffa022
  • Query name: Undefined Scope 'securityScheme' On Global 'security' Field
  • Platform: OpenAPI
  • Severity: Low
  • Category: Access Control
  • URL: Github

Description

Using an scope on global security field that is undefined on 'securityScheme' can be defined by an attacker
Documentation

Code samples

Code samples with security vulnerabilities

Positive test num. 1 - json file
{
  "openapi": "3.0.0",
  "info": {
    "title": "Simple API overview",
    "version": "1.0.0"
  },
  "paths": {
    "/": {
      "get": {
        "operationId": "listVersionsv2",
        "summary": "List API versions",
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": null
            }
          }
        }
      }
    }
  },
  "security": {
    "oAuth2AuthCodeNeg2": [
      "read:api",
      "error:api"
    ]
  },
  "components": {
    "securitySchemes": {
      "oAuth2AuthCodeNeg2": {
        "type": "oauth2",
        "description": "For more information, see https://api.my.company.com/docs/oauth",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://api.my.company.com/oauth/authorize",
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "read:api": "read your apis",
              "admin:api": "admin scope"
            }
          },
          "password": {
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "write:api": "write your apis"
            }
          }
        }
      }
    }
  }
}
Positive test num. 2 - json file
{
  "openapi": "3.0.0",
  "info": {
    "title": "Simple API overview",
    "version": "1.0.0"
  },
  "paths": {
    "/": {
      "get": {
        "operationId": "listVersionsv2",
        "summary": "List API versions",
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": null
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "oAuth2AuthCodeNeg2": [
        "error:api",
        "write:api"
      ]
    }
  ],
  "components": {
    "securitySchemes": {
      "oAuth2AuthCodeNeg2": {
        "type": "oauth2",
        "description": "For more information, see https://api.my.company.com/docs/oauth",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://api.my.company.com/oauth/authorize",
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "read:api": "read your apis",
              "admin:api": "admin scope"
            }
          },
          "password": {
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "write:api": "write your apis"
            }
          }
        }
      }
    }
  }
}
Positive test num. 3 - yaml file
openapi: 3.0.0
info:
  title: Simple API overview
  version: 1.0.0
paths:
  "/":
    get:
      operationId: listVersionsv2
      summary: List API versions
      responses:
        '200':
          description: 200 response
          content:
            application/json:
security:
  oAuth2AuthCodeNeg2:
  - read:api
  - error:api
components:
  securitySchemes:
    oAuth2AuthCodeNeg2:
      type: oauth2
      description: For more information, see https://api.my.company.com/docs/oauth
      flows:
        authorizationCode:
          authorizationUrl: https://api.my.company.com/oauth/authorize
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            read:api: read your apis
            admin:api: admin scope
        password:
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            write:api: write your apis

Positive test num. 4 - yaml file
openapi: 3.0.0
info:
  title: Simple API overview
  version: 1.0.0
paths:
  "/":
    get:
      operationId: listVersionsv2
      summary: List API versions
      responses:
        '200':
          description: 200 response
          content:
            application/json:
security:
- oAuth2AuthCodeNeg2:
  - error:api
  - write:api
components:
  securitySchemes:
    oAuth2AuthCodeNeg2:
      type: oauth2
      description: For more information, see https://api.my.company.com/docs/oauth
      flows:
        authorizationCode:
          authorizationUrl: https://api.my.company.com/oauth/authorize
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            read:api: read your apis
            admin:api: admin scope
        password:
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            write:api: write your apis

Code samples without security vulnerabilities

Negative test num. 1 - json file
{
  "openapi": "3.0.0",
  "info": {
    "title": "Simple API overview",
    "version": "1.0.0"
  },
  "paths": {
    "/": {
      "get": {
        "operationId": "listVersionsv2",
        "summary": "List API versions",
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": null
            }
          }
        }
      }
    }
  },
  "security": [
    {
      "oAuth2AuthCodeNeg2": [
        "read:api",
        "write:api"
      ]
    }
  ],
  "components": {
    "securitySchemes": {
      "oAuth2AuthCodeNeg2": {
        "type": "oauth2",
        "description": "For more information, see https://api.my.company.com/docs/oauth",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://api.my.company.com/oauth/authorize",
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "read:api": "read your apis",
              "admin:api": "admin scope"
            }
          },
          "password": {
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "write:api": "write your apis"
            }
          }
        }
      }
    }
  }
}
Negative test num. 2 - json file
{
  "openapi": "3.0.0",
  "info": {
    "title": "Simple API overview",
    "version": "1.0.0"
  },
  "paths": {
    "/": {
      "get": {
        "operationId": "listVersionsv2",
        "summary": "List API versions",
        "responses": {
          "200": {
            "description": "200 response",
            "content": {
              "application/json": null
            }
          }
        }
      }
    }
  },
  "security": {
    "oAuth2AuthCodeNeg2": [
      "read:api",
      "write:api"
    ]
  },
  "components": {
    "securitySchemes": {
      "oAuth2AuthCodeNeg2": {
        "type": "oauth2",
        "description": "For more information, see https://api.my.company.com/docs/oauth",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://api.my.company.com/oauth/authorize",
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "read:api": "read your apis",
              "admin:api": "admin scope"
            }
          },
          "password": {
            "tokenUrl": "https://api.my.company.com/oauth/token",
            "scopes": {
              "write:api": "write your apis"
            }
          }
        }
      }
    }
  }
}
Negative test num. 3 - yaml file
openapi: 3.0.0
info:
  title: Simple API overview
  version: 1.0.0
paths:
  "/":
    get:
      operationId: listVersionsv2
      summary: List API versions
      responses:
        '200':
          description: 200 response
          content:
            application/json:
security:
- oAuth2AuthCodeNeg2:
  - read:api
  - write:api
components:
  securitySchemes:
    oAuth2AuthCodeNeg2:
      type: oauth2
      description: For more information, see https://api.my.company.com/docs/oauth
      flows:
        authorizationCode:
          authorizationUrl: https://api.my.company.com/oauth/authorize
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            read:api: read your apis
            admin:api: admin scope
        password:
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            write:api: write your apis

Negative test num. 4 - yaml file
openapi: 3.0.0
info:
  title: Simple API overview
  version: 1.0.0
paths:
  "/":
    get:
      operationId: listVersionsv2
      summary: List API versions
      responses:
        '200':
          description: 200 response
          content:
            application/json:
security:
  oAuth2AuthCodeNeg2:
  - read:api
  - write:api
components:
  securitySchemes:
    oAuth2AuthCodeNeg2:
      type: oauth2
      description: For more information, see https://api.my.company.com/docs/oauth
      flows:
        authorizationCode:
          authorizationUrl: https://api.my.company.com/oauth/authorize
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            read:api: read your apis
            admin:api: admin scope
        password:
          tokenUrl: https://api.my.company.com/oauth/token
          scopes:
            write:api: write your apis