//Case study

Case Study: How a Retailer Uncovered Order Data Exposure and Risks to Corporate Video Conferencing

A Sentra AI Hacker pilot uncovered unauthenticated access to historical orders and an attack chain from arbitrary file writes to joining video conferences under another person’s identity.

Sentra TeamSeptember 24, 20265 min read
Warehouse shelving seen from above, with an illuminated central aisle, in a monochrome photograph.

A retailer’s digital services handle orders, payments, and customers’ personal data. A single API flaw can lead to a data breach, fraud in the company’s name, or disruption to the online store.

A large Russian retailer ran a Sentra AI Hacker pilot against its external attack surface to determine which assets were publicly accessible and what an attacker could actually exploit.

Customer profile

  • Retail network: more than 30 stores, an online store, and a mobile app.
  • Geography: more than 20 major cities across Russia.
  • Employees: more than 5,000.
  • Product range: more than 80,000 items.
  • Customers: more than 30,000 shoppers daily.

Pilot scope

Asset and finding counts have been changed to protect the customer’s identity. Technical scenarios and validation results are preserved.

The scope and testing boundaries were agreed in advance. Initial discovery covered 311 assets: domains, IP addresses, web applications, mobile applications, certificates, and ports.

Asset overview

311Total assets

The assessment used a black-box approach, from an external attacker’s perspective.

Vulnerabilities

147Total

By the end of the pilot, the register contained 147 findings, including 5 critical and 10 high severity findings. The first critical findings were recorded the day after the pilot began.

For the most significant scenarios, the team verified what access an attacker could obtain and its potential consequences. Results from the live system and a controlled replica were recorded separately.

Confirmed attack chains

API routes, parameters, and technical field names in the examples have been changed. The sequence of checks and the boundaries of confirmed results are preserved.

1. Customer data and control over other customers’ orders

Sentra AI Hacker
Objective

Test an anonymous device token’s access to other customers’ orders.

Confirmed
3 of 3 confirmed
  1. Mobile APIapi.example
  2. Device tokenDEVICE_CONTEXT
  3. Other customers’ ordersHistorical order store
  4. Order operationsApproved testing
  1. AnalysisA direct request to /example-api/shop/edge-b/device-session returns a block page. I will check path normalization on a neighboring route: the gateway and backend may process it differently. After reaching the API, I will test authorization separately.

    A direct request to /example-api/shop/edge-b/device-session returns a block page. I will check path normalization on a neighboring route: the gateway and backend may process it differently. After reaching the API, I will test authorization separately.

  2. Replay HTTP requestAlternative path reaches the API Completed
    dast_replayAnonymized excerpt
    Input
    GET /example-api/shop/edge-b/device-session?client_marker=<test>
    Control: GET /example-api/shop/edge-a/..%2fedge-b/device-session?client_marker=<same>
    Result
    Direct path → block page
    Alternative path → HTTP 200
    {"device_session":{"value":"[redacted]"}}
  3. Memory recallDevice context and customer sessions represent different access levels Context found
    Search query
    Mobile API: device-session, DEVICE_CONTEXT, archived-purchase, and active-purchase
    Source · Mobile API contract · Device tokens and orders

    A device token is issued before customer login. The contract defines two order information routes: archived-purchase and active-purchase. A device token does not establish order ownership; that relationship must be checked separately on each route.

  4. Execute commandToken payload has the subject DEVICE_CONTEXT Completed
    computer_executeAnonymized excerpt
    Input
    Local inspection of the issued token payload
    Token and signature are not published
    Result
    sub: "DEVICE_CONTEXT"
    No customer login was performed when the token was issued
  5. AnalysisThe token was obtained without login and its subject is DEVICE_CONTEXT. This is a device context. I will test archived-purchase: this token should not retrieve another customer’s order.

    The token was obtained without login and its subject is DEVICE_CONTEXT. This is a device context. I will test archived-purchase: this token should not retrieve another customer’s order.

  6. Replay HTTP requestarchived-purchase returns another customer’s order Completed
    dast_replayAnonymized excerpt
    Input
    GET /example-api/shop/edge-a/..%2fedge-b/archived-purchase
    client_marker=<own test marker>
    purchase_ref=<historical order>
    Authorization: Bearer [redacted]
    Result
    HTTP 200
    Name, phone, email, delivery address: [redacted]
    Purchased items, total amount, payment status
  7. Replay HTTP requestControl identifiers return other customers’ order records Completed
    dast_replayAnonymized excerpt
    Input
    Same anonymous device context
    Only purchase_ref changes within the historical range
    Result
    Other historical records returned
    Identifiers are sequential
    Customer data and order numbers: [redacted]
  8. AnalysisChanging purchase_ref changes the customer and order contents while the device context stays the same. This links the disclosure to missing ownership checks. Next I will distinguish the historical store from the current system.

    Changing purchase_ref changes the customer and order contents while the device context stays the same. This links the disclosure to missing ownership checks. Next I will distinguish the historical store from the current system.

  9. AnalysisThe response contains the full order record, including contact and payment details. I will check the storage boundary: historical and current orders may use different APIs.

    The response contains the full order record, including contact and payment details. I will check the storage boundary: historical and current orders may use different APIs.

  10. Replay HTTP requestThe new system requires customer authentication Completed
    dast_replayAnonymized excerpt
    Input
    Compare archived-purchase and active-purchase
    Same anonymous device context
    Result
    archived-purchase → historical records
    active-purchase → error: customer_login_required · customer authentication required
  11. DecisionTest changes only within the approved scope

    The customer approved cancellation and payment changes on completed orders from previous years. Impact on current orders in the new system was not confirmed.

  12. AnalysisThe mobile API contract includes void-purchase and payment-option. I will verify the business outcome on an approved historical order: HTTP 200 alone is insufficient; the operation code and message must be checked.

    The mobile API contract includes void-purchase and payment-option. I will verify the business outcome on an approved historical order: HTTP 200 alone is insufficient; the operation code and message must be checked.

  13. Replay HTTP requestThe service confirmed order cancellation Completed
    dast_replayAnonymized excerpt
    Input
    POST /example-api/shop/edge-a/..%2fedge-b/void-purchase
    purchase_ref=<approved historical order>
    Authorization: Bearer [redacted]
    Result
    HTTP 200
    {"operation_state":"cancelled","purchase_ref":"[redacted]"}
  14. Replay HTTP requestPayment method changed Completed
    dast_replayAnonymized excerpt
    Input
    POST /example-api/shop/edge-a/..%2fedge-b/payment-option
    purchase_ref=<approved historical order>
    payment_mode=<method under test>
    Result
    HTTP 200
    operation_state: payment_updated
    payment_result.checkout_url: [redacted]
  15. Inspect pagePayment page is accessible Completed
    dast_observe_browserAnonymized excerpt
    Input
    Open the returned payment link
    Do not make a payment
    Result
    HTTP 200
    Valid payment page
  16. AnalysisRead access and operations were confirmed in the historical system. The token was rejected by the new system. I will keep these results separate in the report: this scenario does not confirm control over current orders.

    Read access and operations were confirmed in the historical system. The token was rejected by the new system. I will keep these results separate in the report: this scenario does not confirm control over current orders.

  17. FindingAnonymous access to historical orders

    The alternative route combines with missing ownership checks. Disclosure of order records and approved operations on historical orders were confirmed.

Attack chain
Confirmed

Anonymous access to historical orders

Customer data disclosure and operations on other customers’ orders

Business risk
80/100
Exploitation likelihood
95%

Attack path

Initial access
An anonymous device without a customer session. Operations were approved on completed orders from previous years.
01Obtaining an anonymous token through an alternative pathMobile API Device tokenConfirmed
Prerequisite
The gateway and backend handle the route differently.
Result
The alternative path reaches the device token API; a device token was issued without login.
Alternative path reaches the API
Anonymized research evidence excerpt
Request / action
GET /example-api/shop/edge-b/device-session?client_marker=<test>
Control: GET /example-api/shop/edge-a/..%2fedge-b/device-session?client_marker=<same>
Observation
Direct path → block page
Alternative path → HTTP 200
{"device_session":{"value":"[redacted]"}}
Open in workflow
02Reading another customer’s historical orderDevice token Other customers’ ordersConfirmed
Prerequisite
An anonymous device context is used to call archived-purchase.
Result
An order record with contact, address, and payment information was returned. active-purchase requires authentication.
archived-purchase returns another customer’s order
Anonymized research evidence excerpt
Request / action
GET /example-api/shop/edge-a/..%2fedge-b/archived-purchase
client_marker=<own test marker>
purchase_ref=<historical order>
Authorization: Bearer [redacted]
Observation
HTTP 200
Name, phone, email, delivery address: [redacted]
Purchased items, total amount, payment status
Open in workflow
Control identifiers return other customers’ order records
Anonymized research evidence excerpt
Request / action
Same anonymous device context
Only purchase_ref changes within the historical range
Observation
Other historical records returned
Identifiers are sequential
Customer data and order numbers: [redacted]
Open in workflow
The new system requires customer authentication
Anonymized research evidence excerpt
Request / action
Compare archived-purchase and active-purchase
Same anonymous device context
Observation
archived-purchase → historical records
active-purchase → error: customer_login_required · customer authentication required
Open in workflow
03Cancellation and payment method changeOther customers’ orders Order operationsConfirmed
Prerequisite
The customer approved changes to completed historical orders.
Result
The service confirmed cancellation and payment changes; a valid payment page was obtained without making a payment.
The service confirmed order cancellation
Anonymized research evidence excerpt
Request / action
POST /example-api/shop/edge-a/..%2fedge-b/void-purchase
purchase_ref=<approved historical order>
Authorization: Bearer [redacted]
Observation
HTTP 200
{"operation_state":"cancelled","purchase_ref":"[redacted]"}
Open in workflow
Payment method changed
Anonymized research evidence excerpt
Request / action
POST /example-api/shop/edge-a/..%2fedge-b/payment-option
purchase_ref=<approved historical order>
payment_mode=<method under test>
Observation
HTTP 200
operation_state: payment_updated
payment_result.checkout_url: [redacted]
Open in workflow
Payment page is accessible
Anonymized research evidence excerpt
Request / action
Open the returned payment link
Do not make a payment
Observation
HTTP 200
Valid payment page
Open in workflow

Customer data disclosure and operations on other customers’ orders

Historical orders and approved operations on them were confirmed. The current system requires customer authentication.

Success criterion

Another customer’s order record was retrieved, and approved cancellation and payment changes were confirmed. The current active-purchase system requires authentication.

Remediation

Verify order ownership

Check customer authentication and order ownership for reads and every operation.

Align path normalization

Apply consistent path handling and access rules at the gateway and in the application.

The security gateway and the application processed request paths differently. An alternative route made it possible to obtain a device token without signing in to a customer account. The order service accepted this token but did not verify ownership of the requested order.

Test requests returned other customers’ order details: name, delivery address, phone number, email, purchased items, total amount, and payment status. Sequential numbering made bulk collection of this data possible.

With the customer’s approval, the team tested cancellation and changes to the payment method on completed orders from previous years. The service confirmed both operations and returned a valid payment link. No payment was made.

This access created a risk of personal data disclosure and fraudulent messages impersonating the store, using details from real orders. The chain affected the historical order store. The new system required customer authentication; access to current orders and operations on them was not confirmed.

2. Joining corporate video conferences under another identity

Sentra AI Hacker
Objective

Assess the impact of file writes in the video conferencing service.

Confirmed
4 of 4 confirmed
  1. profile-storeNo session
  2. File writeLive system
  3. CommandsControlled replica
  4. Signing keyControlled replica
  5. Token-based accessControlled replica
  1. AnalysisThe /example-api/meeting/profile-store endpoint has no session check. The user field affects the write path. I will test directory traversal and the resulting file format: an arbitrary write alone does not prove code execution.

    The endpoint /example-api/meeting/profile-store has no session check. The user field affects the write path. I will test directory traversal and the resulting file format: an arbitrary write alone does not prove code execution.

  2. Replay HTTP requestHandler accepts a request without a session Completed
    dast_replayAnonymized excerpt
    Input
    POST /example-api/meeting/profile-store
    Control marker, no authentication
    Result
    HTTP 200
    Response: ok
  3. Replay HTTP requestOracle distinguishes a file from a nonexistent path Completed
    dast_replayAnonymized excerpt
    Input
    Test a path outside the data directory
    Compare a nonexistent path with a marker file
    Result
    Nonexistent path → Errno 2: No such file
    File + <control child segment> → Errno 20: Not a directory
  4. Memory recallThe write format determines the possible trigger Context found
    Search query
    profile-store: file serialization, Python .pth/sitecustomize, execution conditions
    Source · Handler notes · Write format and rejected paths

    The handler serializes content, so writing to an executable path does not itself imply execution. Python .pth requires an executable import at the start of the line; a standalone string literal in sitecustomize does not execute the text it contains.

  5. AnalysisENOTDIR indicates a file at the target path. However, the handler serializes content: an unsuitable format remains a string. I will continue full escalation in a controlled replica. Only the file write is confirmed in the live system so far.

    ENOTDIR indicates a file at the target path. However, the handler serializes content: an unsuitable format remains a string. I will continue full escalation in a controlled replica. Only the file write is confirmed in the live system so far.

  6. DecisionMove further steps to a controlled replica

    The replica is used to test the write format, execution trigger, container privileges, and token acceptance. Results from the live system and replica are recorded separately.

  7. Execute commandWrite format reproduced locally Completed
    computer_executeAnonymized excerpt
    Input
    Controlled replica of the handler
    Compare the input value with the resulting file
    Result
    Serialized format reproduced
    Quotation marks affect content interpretation
  8. Execute commandThe Python path does not execute automatically Completed
    computer_executeAnonymized excerpt
    Input
    Controlled replica: compare the format with .pth and sitecustomize
    This path was not tested on the live system
    Result
    .pth: the required executable import is not produced
    sitecustomize: a standalone string literal
    Automatic execution through this path is not confirmed
  9. AnalysisI will reject the Python path: the location is suitable, but the write format does not produce executable code. The remaining chain requires a separate trigger. I will test it in the replica and record which action produces the result.

    I will reject the Python path: the location is suitable, but the write format does not produce executable code. The remaining chain requires a separate trigger. I will test it in the replica and record which action produces the result.

  10. Execute commandA trigger in the replica causes command execution Completed
    computer_executeAnonymized excerpt
    Input
    Controlled environment: write → approved trigger → check the control marker
    Result
    Control marker appeared after the trigger
    Privileges: container administrator
    No claim of automatic execution on the live system
  11. AnalysisCommand execution with container administrator privileges was obtained in the replica. I will check whether this context can access the key the service uses to sign conference tokens.

    Command execution with container administrator privileges was obtained in the replica. I will check whether this context can access the key the service uses to sign conference tokens.

  12. Execute commandSigning key accessible in the controlled environment Completed
    computer_executeAnonymized excerpt
    Input
    Inspect configuration and signing mechanism
    Environment: controlled replica
    Result
    Signing key: [redacted]
    Context: container administrator
  13. AnalysisA valid signature alone does not prove access. I will test a token for a chosen identity against the conferencing components in the same replica. Neither the key nor the token will be published.

    A valid signature alone does not prove access. I will test a token for a chosen identity against the conferencing components in the same replica. Neither the key nor the token will be published.

  14. Execute commandReplica components accept the forged token Completed
    computer_executeAnonymized excerpt
    Input
    Controlled replica: create token → test conference access
    Result
    Signature accepted
    Access under the chosen employee identity confirmed
  15. FindingAttack chain leading to access under another identity

    Arbitrary file writes were confirmed on the live system. The full chain from command execution to forged token acceptance was reproduced in a controlled replica.

Attack chain
Confirmed

File writes → conference signing key

Conference access under a chosen identity

Business risk
80/100
Exploitation likelihood
90%

Attack path

Initial access
A visitor without a session. Further escalation was investigated in a controlled replica of the service.
01Writing outside the data directoryprofile-store File writeConfirmed
Test environment
Live system
Prerequisite
The user field affects the write path; there is no session check.
Result
A file at the target path was confirmed through the Errno 2 / ENOTDIR difference.
Handler accepts a request without a session
Anonymized research evidence excerpt
Request / action
POST /example-api/meeting/profile-store
Control marker, no authentication
Observation
HTTP 200
Response: ok
Open in workflow
Oracle distinguishes a file from a nonexistent path
Anonymized research evidence excerpt
Request / action
Test a path outside the data directory
Compare a nonexistent path with a marker file
Observation
Nonexistent path → Errno 2: No such file
File + <control child segment> → Errno 20: Not a directory
Open in workflow
02Executing commands from a written fileFile write CommandsConfirmed
Test environment
Controlled replica
Prerequisite
Content serialization and execution conditions were reproduced in the replica.
Result
Commands ran with container administrator privileges in the controlled environment. The live system was not exploited at this stage.
Write format reproduced locally
Anonymized research evidence excerpt
Request / action
Controlled replica of the handler
Compare the input value with the resulting file
Observation
Serialized format reproduced
Quotation marks affect content interpretation
Open in workflow
A trigger in the replica causes command execution
Anonymized research evidence excerpt
Request / action
Controlled environment: write → approved trigger → check the control marker
Observation
Control marker appeared after the trigger
Privileges: container administrator
No claim of automatic execution on the live system
Open in workflow
03Access to the signing keyCommands Signing keyConfirmed
Test environment
Controlled replica
Prerequisite
A container administrator context is available in the replica.
Result
The conference token signing key is accessible in the controlled environment’s configuration.
Signing key accessible in the controlled environment
Anonymized research evidence excerpt
Request / action
Inspect configuration and signing mechanism
Environment: controlled replica
Observation
Signing key: [redacted]
Context: container administrator
Open in workflow
04Acceptance of a token for a chosen identitySigning key Token-based accessConfirmed
Test environment
Controlled replica
Prerequisite
The signing key was obtained in the controlled environment.
Result
Replica components accepted the token. The equivalent action was not performed on the live system.
Replica components accept the forged token
Anonymized research evidence excerpt
Request / action
Controlled replica: create token → test conference access
Observation
Signature accepted
Access under the chosen employee identity confirmed
Open in workflow

Conference access under a chosen identity

Live system: arbitrary file write. Controlled replica: commands, signing key, and token acceptance.

Success criterion

File writes were confirmed on the live system. Commands, key access, and token acceptance were confirmed only in the controlled replica.

Remediation

Restrict the write path and format

Add authorization and validate the canonical write path within the allowed directory.

Isolate the signing key

Restrict container privileges and key access; rotate the key if exposure is confirmed.

The video conferencing service exposed a handler without an authentication check. It could create and overwrite files outside the user data directory. Arbitrary file writes were confirmed on the live system.

Further steps were reproduced in a controlled replica: writing a file and invoking a separate trigger resulted in command execution with container administrator privileges. From that context, the conference token signing key was accessible.

The recovered key was used to create a token for a chosen employee identity. The conferencing components in the replica accepted it and granted access to a conference. The complete chain was confirmed in the replica; testing on the live system was limited to file writes.

The scenario demonstrated the risk of joining private meetings under another identity, exposing confidential discussions, and disrupting corporate video conferencing.

Pilot outcome

The retailer received a technical report with severity ratings, evidence, reproduction steps, and attack chain analysis. Remediation guidance was divided into immediate and additional measures. Sentra automatically prioritized fixes based on confirmed exploitation scenarios and business risk.

The team received the first critical findings the day after the pilot began, so remediation started while the pilot was still underway. Retesting confirmed that the configurator vulnerability was fixed. Continuous assessment also detected a regression: a previously fixed issue that revealed whether a customer existed by their phone number had returned.

The team received concrete tasks to protect customer data and corporate services. Retest results helped track remediation and detect the return of previously fixed issues.

Pilot

Let’s discuss the scope and terms of your pilot

Request a pilot
Request a pilot contact@sentra-tech.ru