Skip to content

Authorization bypass: @RolesAllowed unenforced on microservices, workflow-compiling-service requires no token at all #4904

@Yicong-Huang

Description

@Yicong-Huang

What happened?

@RolesAllowed annotations on microservice resources are not enforced because none of the microservices register Jersey's RolesAllowedDynamicFeature. The annotations are decorative — anyone with a valid JWT can hit endpoints labeled @RolesAllowed(Array("ADMIN")), regardless of the user's role.

workflow-compiling-service is worse: it registers neither JwtAuthFilter nor RolesAllowedDynamicFeature, so its @RolesAllowed endpoint runs without any authentication or authorization at all.

amber correctly registers RolesAllowedDynamicFeature (amber/.../web/TexeraWebApplication.scala:142 and amber/.../web/ComputingUnitMaster.scala:172), so its annotations work as intended.

Service JwtAuthFilter RolesAllowedDynamicFeature uses @RolesAllowed?
access-control-service yes no no
config-service yes no yes (2 places)
file-service yes no no
computing-unit-managing-service yes no yes (10+ places)
workflow-compiling-service no no yes (1 place)
amber (TexeraWebApplication, ComputingUnitMaster) yes yes yes

Concrete decorative annotations:

  • config-service/.../resource/ConfigResource.scala:32, 66@RolesAllowed(Array("REGULAR", "ADMIN"))
  • computing-unit-managing-service/.../resource/ComputingUnitManagingResource.scala:252, 262, 276, 491, 594, 642, 682, 736, 751@RolesAllowed(Array("REGULAR", "ADMIN"))
  • computing-unit-managing-service/.../resource/ComputingUnitAccessResource.scala:104 — same
  • workflow-compiling-service/.../resource/WorkflowCompilationResource.scala:59 — same (and the request is unauthenticated to begin with)

How to reproduce?

  1. Issue a JWT for a user whose role is below the one a @RolesAllowed annotation requires (e.g. role INACTIVE against @RolesAllowed(Array("REGULAR", "ADMIN"))).
  2. curl -H "Authorization: Bearer <that-token>" http://localhost:<port>/api/<annotated-endpoint> against config-service or computing-unit-managing-service.
  3. Observe: the request succeeds with 200. The role check is silently skipped.
  4. For workflow-compiling-service, omit the token entirely: any request reaches the resource method. No JwtAuthFilter runs because the service never registers it.

Branch

main

Commit Hash (Optional)

786a920

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions