Urgent.News

What's breaking now, across thousands of outlets.

Tech

A search box that JOINed to your token table: ORM filter injection in KoboToolbox (GHSA-xrq7-925g-qg5m)

TL;DR What: The asset-search endpoint in KoboToolbox kpi built a Django Q(**{field: value}) from the field name in q= , and nothing limited which fields that name could reach. The grammar allows __ , so an authenticated user could send a relational lookup like owner__auth_token__key__startswith , which JOINs from an asset to its owner's API token. Impact: The paginated count in the response works…

KoboToolbox, an open-source data collection platform for humanitarian action, development, environmental protection, research, and social good, discovered a vulnerability in its kpi server called ORM filter injection. This flaw, identified as GHSA-xrq7-925g-qg5m, allows authenticated users to recover parts of an owner's API token through a malicious search query. The search box in the asset table of the kpi inadvertently allowed users to construct a Django Q(**{field: value}) object, granting access to unintended fields.

When a GET request is made to the search endpoint with a specially crafted query, the permission filter allows the user to see assets shared with them. The KpiObjectPermissionsFilter then applies the user-defined query to a permission-scoped queryset. By inserting a lookup such as owner__auth_token__key__startswith, the attacker could retrieve individual characters of the owner's API token, one at a time. Although the loop was not executed further and no token was used, the vulnerability posed a significant security risk.

KoboToolbox addressed the issue in version 2.026.23a and notified self-hosted installations to update promptly. The vulnerability highlights the importance of securely implementing ORM filters in web applications, especially when sharing features are involved, to prevent unauthorized access to sensitive data.

Written by urgent.news from Dev.to's reporting — not their text. Machine-written — may contain errors; check the original before relying on it.

Read the original at dev.to →

More in Tech

How to Use a Proxy in Python requests

A proxy in Python requests is a gateway URL stored on the Session. Each call goes to that gateway first, and the site sees the exit IP instead of your machine.

  • Proxy in Python requests acts as a gateway URL stored in a Session.
  • Proxies dict maps target scheme (http or https) to gateway URL.
  • SOCKS gateway under https key when target begins with https://.

What a pinned commit actually buys you when you run someone else's agent

You hire an agent. You read the description, maybe you skim the repo, you connect it to something. A week later the developer pushes a commit. What are you running now?

  • Agent key can reside on agent's servers, your servers, or your machine
  • Pinned commit prevents running a different version after a new push
  • Pinning introduces delays in approval process and developer updates

Getting Started with the TTSFree API: Generate Hindi Speech with cURL

Getting Started with the TTSFree API: Generate Hindi Speech with cURL TTSFree.in provides an API for developers who want to integrate AI text-to-speech and other audio capabilities into their…

  • TTSFree.in provides API for text-to-speech in Indian languages, including Hindi.
  • Generate Hindi speech using cURL by sending POST request to https://ttsfree.in/v1/jobs.
  • Download generated speech file as hello.wav after job completion.

SSH Certificate Authentication with ssh-keygen (2026)

You have forty devices in the field, three people who need shell access, and an authorized_keys file on every one of them. Someone leaves, and you get to touch forty files.

  • SSH certificate authentication simplifies managing shell access across devices
  • User and host certificates signed by user and host CAs, respectively
  • Server verifies CA signature, validity window, and principals during login

More from Wednesday 11 November →