- Status Closed
-
Assigned To
cbay - Private
Opened by vdpresearch - 27.10.2026
Last edited by cbay - 28.10.2026
FS#537 - Edge POST filter bypass: dispatcher honours "action" on /task/* (profile e-mail/name writable)
SUMMARY
The edge filter on security.alwaysdata.com only allows POST to /task/* and
/index.php?do=authenticate. Flyspray dispatches on the "action" field and ignores
the path, so POSTing the profile-edit form to /task/<any id> executes the action.
POST /myprofile -> 403 (blocked by the filter) POST /task/536 -> 303, change stored (same body, action=myprofile.edituser)
Reproduced on my own account (uid 358) on 2026-10-27, all changes reverted:
real_name -> "Ali Abbas ROUTE" (stored) -> reverted email -> admin@bugbountyscam.com (stored) -> reverted
STEPS
1. GET https://security.alwaysdata.com/myprofile as a logged-in user; take csrftoken.
2. POST the profile form to /myprofile ⇒ HTTP/2 403 Forbidden.
3. POST the identical multipart body to /task/<any task id>
with action=myprofile.edituser => HTTP/2 303 See Other, Location: https://security.alwaysdata.com/myprofile
4. Reload /myprofile: real_name and email_address contain the submitted values.
ROOT CAUSE
Filter decision is path-prefix based; application handler selection is based on
the "action" parameter. No component validates that the two agree.
SCOPE OF THE BYPASS
- Every other blocked POST path tested (/index.php, /proj1, /newtask/proj1,
/myprofile) still returns 403; only /task/* reaches the dispatcher.
- Unauthenticated requests have no effect (session check holds, login page).
- user_id=1 / user_id=99999 in the body are ignored - handler always targets the
session user. Group fields (group_in, old_global_id) ignored, server-side only.
So this bypasses the transport filter, not the per-action authorisation.
IMPACT
Any POST route the edge rule is meant to protect can be reached by relabelling
the path as /task/<id>. Persistent writes were demonstrated (profile e-mail and
real name); changing the profile e-mail also changes where account notifications
and recovery messages are delivered.
REMEDIATION
- Enforce the POST allow-list on the dispatched action, not the URL path.
- Reject requests whose "action" does not belong to the route they were sent to.
- Make the dispatcher refuse action processing on controllers that do not
declare that action.
Timestamp: 2026-10-27 18:2x UTC. Testing was manual, own account only, low rate.
Loading...
Available keyboard shortcuts
- Alt + ⇧ Shift + l Login Dialog / Logout
- Alt + ⇧ Shift + a Add new task
- Alt + ⇧ Shift + m My searches
- Alt + ⇧ Shift + t focus taskid search
Tasklist
- o open selected task
- j move cursor down
- k move cursor up
Task Details
- n Next task
- p Previous task
- Alt + ⇧ Shift + e ↵ Enter Edit this task
- Alt + ⇧ Shift + w watch task
- Alt + ⇧ Shift + y Close Task
Task Editing
- Alt + ⇧ Shift + s save task
Correction to the scope note in the description (my error, measured after filing):
POST /newtask/proj1 is NOT blocked - it returns 303 and is how this task was
submitted. The blocked set I actually observed is:
So the edge filter already admits the new-task route; the bypass matters for the
routes it does block, where the dispatcher still executes the action from the body.
The demonstrated case remains: profile real_name and email_address are writable
through POST /task/<id> with action=myprofile.edituser, while POST /myprofile is
refused with 403. Everything in the reproduction section is unchanged.
Escalation bounds, measured after the report - posted so the severity can be pinned down and this does not get closed as an over-claim.
1) The dispatcher really does accept arbitrary action values on /task/<id>:
2) But per-action authorisation still holds, so this is NOT privilege escalation.
3) So the defect is confined to the transport layer: it defeats the edge POST filter, and the write that persists is on the caller's own profile (myprofile.edituser), which the filter is meant to make unreachable by POST. I am not claiming account takeover or admin access - please treat the Medium rating as the ceiling for this one.
4) Re-confirmed today: POST /myprofile → 403; identical body to POST /task/536 → 303; values written, then reverted to the originals (real_name 'Ali Abbas', email_address delegate4@bugbountyscam.com). Own account only.
Hello,
If you can only modify details on your own account, then it's not a vulnerability.
Kind regards,
Cyril
yes
i only can change detail on my own account, but the simple changes shows 403 ,
if its not it means you will not fix it rit ?
Yes.