Message-ID: <eb527ccc-81df-438c-8596-2b6235283071@flowerfield.dev>
Date: Sat, 15 Feb 2025 11:42:13 +0100
MIME-Version: 1.0
User-Agent: Mozilla Thunderbird
From: phoebe <phoebe@flowerfield.dev>
To: shuduizhang@xiaohongshu.com
Content-Language: en-US
Autocrypt: addr=phoebe@flowerfield.dev; keydata=
 xjMEZxO/yBYJKwYBBAHaRw8BAQdAlagvf+uRL4Ug5npHaABJElUWLw5OxRF9r8VmqCBus8jN
 JVBob2ViZSBEdXNpbCA8cGhvZWJlQGZsb3dlcmZpZWxkLmRldj7CmQQTFgoAQQIbAwULCQgH
 AgIiAgYVCgkICwIEFgIDAQIeBwIXgBYhBDxqjXxo2Rs9dKIdc5swI71KOSQ7BQJnGDqABQkF
 qBU4AAoJEJswI71KOSQ7qOYA/jWtLOmqsCA0eqjpH20n4d/5Yi/ab4ACyA13HUsYjpbtAPsH
 c+AAJGYpo8kJWmdVWHBegvagd/QPGpSeN5IPLlFuB844BGcTv8gSCisGAQQBl1UBBQEBB0BM
 7hwvFDz/OnEqGtlehnwqDSbGrmBBAMlCnQoilCVnMQMBCAfCeAQYFgoAIBYhBDxqjXxo2Rs9
 dKIdc5swI71KOSQ7BQJnE7/IAhsMAAoJEJswI71KOSQ7dyEA/11Oas2mCaz08I6CvqDcx2Ej
 ecPtqVyTqnvuXM3NQPslAP42xdh6Rcx6l7mwivWmnRAfg4yf5x0h/rUIXEkt+rntDw==
Subject: Critical network vulnerability
Content-Type: multipart/signed; micalg=pgp-sha256;
 protocol="application/pgp-signature";
 boundary="------------81Crbut4NxK0WJp0kz00yQp0"

This is an OpenPGP/MIME signed message (RFC 4880 and 3156)
--------------81Crbut4NxK0WJp0kz00yQp0
Content-Type: multipart/mixed; boundary="------------FDXySm3eSRGq0eQWzxiUgbuc";
 protected-headers="v1"
From: phoebe <phoebe@flowerfield.dev>
To: shuduizhang@xiaohongshu.com
Message-ID: <eb527ccc-81df-438c-8596-2b6235283071@flowerfield.dev>
Subject: Critical network vulnerability

--------------FDXySm3eSRGq0eQWzxiUgbuc
Content-Type: multipart/mixed; boundary="------------m4C2lQ9CEb1Ql6Roklxoxecl"

--------------m4C2lQ9CEb1Ql6Roklxoxecl
Content-Type: multipart/alternative;
 boundary="------------fNf0i7ksF6iR3RXpy3OKuavz"

--------------fNf0i7ksF6iR3RXpy3OKuavz
Content-Type: text/plain; charset=UTF-8; format=flowed
Content-Transfer-Encoding: base64

RGVhciBYaWFvaG9uZ3NodSB0ZWFtLA0KDQpteSBuYW1lIGlzIFBob2ViZSBhbmQgSSBhbSBh
IHNlY3VyaXR5IHJlc2VhcmNoZXIuIEZvciB0aGUgcGFzdCB3ZWVrIEkgDQpoYXZlIGJlZW4g
bG9va2luZyBpbnRvIHRoZSBSZWROb3RlIGFwcCBhbmQgZGlzY292ZXJlZCBzZXZlcmUgaXNz
dWVzIGluIA0KaG93IHRoZSBhcHAgaW50ZXJhY3RzIHdpdGggdGhlIHNlcnZlciBBUEkuDQoN
Cg0KICAgICAgVGVjaG5pY2FsIGRldGFpbHMNCg0KUGFydCBvZiB0aGUgbmV0d29yayBjb21t
dW5pY2F0aW9uIGluIHRoZSBSZWROb3RlIGFwcCAoY29tLnhpbmdpbi54aHMpIGlzIA0KdW5l
bmNyeXB0ZWQgYWxsb3dpbmcgYWR2ZXJzYXJpZXMgdG8gbGlzdGVuIHRvIHRoZSBuZXR3b3Jr
IGFuZCBjYXB0dXJlIA0KaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzZXIuIFRoaXMgaW5mb3Jt
YXRpb24gaW5jbHVkZXMgd2hhdCBhY3Rpb25zIHRoZSANCnVzZXIgcGVyZm9ybXMgb24geW91
ciBzZXJ2aWNlIChmb2xsb3dpbmcgYWNjb3VudHMsIGxpa2luZyBwb3N0cywgc2VuZGluZyAN
CmRpcmVjdCBtZXNzYWdlcywgZXRjLiksIGJ1dCBhbHNvIGluZm9ybWF0aW9uIGFib3V0IHRo
ZSBkZXZpY2UgdGhlIHVzZXIgDQppcyBsb2dnaW5nIGludG8gdGhlIGFwcCBvbi4gQWxsIG9m
IHRoaXMgaGFwcGVucyBpbiB0aGUgbGlieGhzbG9uZ2xpbmsuc28gDQpzaGFyZWQgbGlicmFy
eSwgd2hlcmUgaXQgY3JlYXRlcyBhIGNvbm5lY3Rpb24gdG8gb25lIG9mIHRoZSBzZXJ2ZXIg
SVBzIA0Kb3ZlciBwb3J0IDUzMzMgYW5kIHNlbmRzIHBhY2tldHMgY29udGFpbmluZyBhIDEy
IGJ5dGUgaGVhZGVyIGFuZCBhIA0KcHJvdG9idWYtZW5jb2RlZCBwYXlsb2FkLg0KDQpTb21l
IG9mIHRoZSBwYXlsb2FkcyBkbyBub3QgbGVhayB0b28gbXVjaCBpbmZvcm1hdGlvbiwgYnV0
IGV2ZW4ganVzdCBpbiANCnRoZSBmaXJzdCBjb3VwbGUgb2YgcGFja2V0cyBhIFNlc3Npb25B
dXRoIHByb3RvIG1lc3NhZ2UgaXMgc2VudCBhbmQgYW4gDQpBdXRoUmVzcCBtZXNzYWdlIGlz
IHJldHVybmVkIGJ5IHRoZSBzZXJ2ZXIuIElmIGFuIGFkdmVyc2FyeSwgd2hvIHdlIHdpbGwg
DQpjYWxsIEV2ZSwgY2FwdHVyZXMgdGhlIFNlc3Npb25BdXRoIG9mIGEgdXNlciBBbGljZSwg
RXZlIGNhbiB0aGVuIHNhdmUgDQpBbGljZSdzIGF1dGhlbnRpY2F0aW9uIGluZm9ybWF0aW9u
IGFuZCBhdCBhIGxhdGVyIHBvaW50IGluIHRpbWUgDQphdXRoZW50aWNhdGUgYXMgQWxpY2Ug
aW4gdGhlIEFQSSBhbmQgcGVyZm9ybSBvdGhlciBBUEkgYWN0aW9ucyB0aHJvdWdoIA0KQWxp
Y2UncyBhY2NvdW50LiBFc3NlbnRpYWxseSBnaXZpbmcgRXZlIGNvbXBsZXRlIGNvbnRyb2wg
b3ZlciBBbGljZSdzIA0KYWNjb3VudC4NCg0KSW4gc29tZSBjYXNlcyB0aGUgU2Vzc2lvbkF1
dGggd2lsbCBoYXZlIGEgY2lwaGVyVHlwZSBmaWVsZCBzZXQgdG8gMSwgDQpjYXVzaW5nIGNo
YXQgcHJvdG8gbWVzc2FnZXMgdG8gYmUgZW5jcnlwdGVkIHVzaW5nIEFFUzEyOC1FQ0IsIGJ1
dCB0aGUgDQprZXkgdXNlZCBmb3IgdGhlIGVuY3J5cHRpb24gaXMgYWxzbyBzZW50IGluIHBs
YWludGV4dCBpbiB0aGUgQXV0aFJlc3AsIA0KdGh1cyBhbGxvd2luZyBFdmUgdG8gY2FwdHVy
ZSB0aGUga2V5IGFuZCBkZWNyeXB0IGFsbCBzdWNoIHBhY2tldHMgYXMgd2VsbC4NCg0KQXMg
YW4gYWRkaXRpb25hbCBpc3N1ZSwgdGhlIG9ubHkgaW5mb3JtYXRpb24gbmVjZXNzYXJ5IHRv
IGdldCANCmF1dGhlbnRpY2F0ZWQgd2l0aCB0aGUgc2VydmVyIGlzIGEgdWlkLCBhbiBzaWQg
KHRva2VuKSBhbmQgZGV2aWNlIA0KaW5mb3JtYXRpb24uIENvbnNpZGVyaW5nIHRoZSB1aWQg
aXMgcHVibGljIGluZm9ybWF0aW9uIGFuZCB0aGUgc2lkIGxvb2tzIA0KdG8gYmUgYSBuYW5v
c2Vjb25kIHRpbWVzdGFtcCBvZiBhY2NvdW50IGNyZWF0aW9uIHdpdGggc29tZSBleHRyYSBk
aWdpdHMsIA0KdGhpcyBsZWF2ZXMgYWJvdXQgNiBkaWdpdHMgKGFzc3VtaW5nIHRoZSBuYW5v
c2Vjb25kIHByZWNpc2lvbiBpcyANCmRpZmZpY3VsdCB0byBmaW5kKSBvZiBzZWN1cml0eSBh
bmQgZGV2aWNlIGluZm9ybWF0aW9uIGtlZXBpbmcgYW4gYWNjb3VudCANCnNlY3VyZSwgd2hp
Y2ggaW4gaXRzZWxmIGlzIGNvbmNlcm5pbmcgYW5kIHNob3VsZCBiZSBoYXJkZW5lZC4NCg0K
DQogICAgICBTb2x1dGlvbnMNCg0KVGhlIGFwcCBpcyBjYXBhYmxlIG9mIHVzaW5nIFRMUyBm
b3IgY29tbXVuaWNhdGluZyB3aXRoIHRoZSBDRE5zLCBzbyBJIA0Kd291bGQgc3VnZ2VzdCBt
aWdyYXRpbmcgdGhlIGNvbnRyb2wgQVBJIHRvIHVzaW5nIFRMUy4gVXNpbmcgYSANCnByb3By
aWV0YXJ5IHByb3RvY29sIHVzdWFsbHkgc291bmRzIGxpa2UgYSBuaWNlIGlkZWEsIGJ1dCB1
bHRpbWF0ZWx5IA0KZmFpbHMgaW4gcHJhY3RpY2UsIHNvIEkgY2Fubm90IHN0cmVzcyBlbm91
Z2ggaG93IGltcG9ydGFudCBpdCBpcyB0byANCm1pZ3JhdGUgdG8gcHJvdG9jb2xzIHRoYXQg
aGF2ZSBiZWVuIHNjcnV0aW5pemVkIGluIHRoZSBwYXN0Lg0KDQpDb25zaWRlcmluZyB0aGUg
c2V2ZXJpdHkgb2YgdGhlIHZ1bG5lcmFiaWxpdHkgaXQgd291bGQgYmUgcmVzcG9uc2libGUg
dG8gDQppbnRyb2R1Y2UgYSBicmVha2luZyBjaGFuZ2UgYW5kIGZvcmNlIHVzZXJzIHRvIHVw
ZGF0ZSBpbnN0ZWFkIG9mIA0KZ3JhZHVhbGx5IG1pZ3JhdGluZyB0aGUgQVBJcywgc2luY2Ug
YSB0cmFuc2l0aW9uIHBoYXNlIHdvdWxkIGFsbG93IA0KYWR2ZXJzYXJpZXMgdG8gY29sbGVj
dCBhcyBtdWNoIGluZm9ybWF0aW9uIGFib3V0IHlvdXIgdXNlcnMgYXMgdGhleSBjYW4gDQp3
aGlsZSB0aGUgbWlncmF0aW9uIGhhcHBlbnMuDQoNCkFzIGZvciB0aGUgaXNzdWUgd2l0aCBv
bmx5IG5lZWRpbmcgYSB0aW1lc3RhbXAtZm9ybWVkIHNpZCBhbmQgZGV2aWNlIA0KaW5mb3Jt
YXRpb24gdG8gbG9naW4gdG8gYW4gYWNjb3VudCwgaXQgaXMgbmVjZXNzYXJ5IHRoYXQgeW91
IGltcHJvdmUgdGhlIA0Kc2VjdXJpdHkgb2YgYWNjb3VudHMgYW5kIGludHJvZHVjZSBlLmcu
IGEgcGFzc3dvcmQgc2NoZW1lIHVzaW5nIGhhc2hlZCANCnBhc3N3b3JkIHN0cmluZ3MsIG9y
IG90aGVyIHNpbWlsYXIgc2NoZW1lcyB0aGF0IHVzZSBpbmZvcm1hdGlvbiBvbmx5IA0Ka25v
d24gYnkgdGhlIGFjY291bnQgaG9sZGVyIGFuZCB0aGF0IGNhbm5vdCBiZSBndWVzc2VkIGJh
c2VkIG9uIA0Kb2JzZXJ2YWJsZSBpbmZvcm1hdGlvbi4NCg0KDQogICAgICBQdWJsaWNhdGlv
bg0KDQpUaGUgdnVsbmVyYWJpbGl0aWVzIEkgYW0gYnJpbmdpbmcgdG8geW91ciBhdHRlbnRp
b24gaW4gdGhpcyBlbWFpbCB3aWxsIA0KYmUgcHVibGljaXplZCBieSB0aGUgZW5kIG9mIG5l
eHQgd2VlayAodGhlIDIzcmQgb2YgRmVicnVhcnkpLCBldmVuIGlmIA0Kbm90IHlldCBmaXhl
ZC4gQWx0aG91Z2gsIEkgZG8gdW5kZXJzdGFuZCB1cGRhdGluZyBjb2RlIHRha2VzIHRpbWUg
YW5kIA0KZWZmb3J0LCBzbyBpZiB5b3Ugd2lzaCBmb3IgbWUgdG8gZGVsYXkgYnJpbmdpbmcg
dGhpcyBpc3N1ZSB0byB0aGUgDQpwdWJsaWMsIGZlZWwgZnJlZSB0byByZWFjaCBvdXQgYW5k
IHdlIGNhbiBkaXNjdXNzIHNwZWNpZmljcy4NCg0KSW4gdGhlIGVuZCwgbXkgbWFpbiBwcmlv
cml0eSBpcyB0aGUgc2VjdXJpdHkgb2YgeW91ciB1c2Vycywgc28gSSBhbSBvcGVuIA0KdG8g
YW55IHF1ZXN0aW9ucyB5b3VyIHRlYW0gbWF5IGhhdmUuDQoNCg0KS2luZGVzdCByZWdhcmRz
LA0KDQpQaG9lYmUNCg0K
--------------fNf0i7ksF6iR3RXpy3OKuavz
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<!DOCTYPE html>
<html>
  <head>
    <meta http-equiv=3D"content-type" content=3D"text/html; charset=3DUTF=
-8">
  </head>
  <body>
    <p><font face=3D"Helvetica, Arial, sans-serif">Dear Xiaohongshu team,=
</font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">my name is Phoebe and =
I
        am a security researcher. For the past week I have been looking
        into the RedNote app and discovered severe issues in how the app
        interacts with the server API.</font></p>
    <h3><font face=3D"Helvetica, Arial, sans-serif">Technical details<br>=

      </font></h3>
    <p><font face=3D"Helvetica, Arial, sans-serif">Part of the network
        communication in the RedNote app (com.xingin.xhs) is unencrypted
        allowing adversaries to listen to the network and capture
        information about the user. This information includes what
        actions the user performs on your service (following accounts,
        liking posts, sending direct messages, etc.), but also
        information about the device the user is logging into the app
        on. All of this happens in the libxhslonglink.so shared library,
        where it creates a connection to one of the server IPs over port
        5333 and sends packets containing a 12 byte header and a
        protobuf-encoded payload.</font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">Some of the payloads d=
o
        not leak too much information, but even just in the first couple
        of packets a SessionAuth proto message is sent and an AuthResp
        message is returned by the server. If an adversary, who we will
        call Eve, captures the SessionAuth of a user Alice, Eve can then
        save Alice's authentication information and at a later point in
        time authenticate as Alice in the API and perform other API
        actions through Alice's account. Essentially giving Eve complete
        control over Alice's account.<br>
      </font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">In some cases the
        SessionAuth will have a cipherType field set to 1, causing chat
        proto messages to be encrypted using AES128-ECB, but the key
        used for the encryption is also sent in plaintext in the
        AuthResp, thus allowing Eve to capture the key and decrypt all
        such packets as well.</font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">As an additional issue=
,
        the only information necessary to get authenticated with the
        server is a uid, an sid (token) and device information.
        Considering the uid is public information and the sid looks to
        be a nanosecond timestamp of account creation with some extra
        digits, this leaves about 6 digits (assuming the nanosecond
        precision is difficult to find) of security and device
        information keeping an account secure, which in itself is
        concerning and should be hardened.</font></p>
    <h3><font face=3D"Helvetica, Arial, sans-serif">Solutions</font></h3>=

    <p><font face=3D"Helvetica, Arial, sans-serif">The app is capable of
        using TLS for communicating with the CDNs, so I would suggest
        migrating the control API to using TLS. Using a proprietary
        protocol usually sounds like a nice idea, but ultimately fails
        in practice, so I cannot stress enough how important it is to
        migrate to protocols that have been scrutinized in the past.</fon=
t></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">Considering the
        severity of the vulnerability it would be responsible to
        introduce a breaking change and force users to update instead of
        gradually migrating the APIs, since a transition phase would
        allow adversaries to collect as much information about your
        users as they can while the migration happens.</font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">As for the issue with
        only needing a timestamp-formed sid and device information to
        login to an account, it is necessary that you improve the
        security of accounts and introduce e.g. a password scheme using
        hashed password strings, or other similar schemes that use
        information only known by the account holder and that cannot be
        guessed based on observable information.<br>
      </font></p>
    <h3><font face=3D"Helvetica, Arial, sans-serif">Publication</font></h=
3>
    <p><font face=3D"Helvetica, Arial, sans-serif">The vulnerabilities I
        am bringing to your attention in this email will be publicized
        by the end of next week (the 23rd of February), even if not yet
        fixed. Although, I do understand updating code takes time and
        effort, so if you wish for me to delay bringing this issue to
        the public, feel free to reach out and we can discuss specifics.<=
br>
      </font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">In the end, my main
        priority is the security of your users, so I am open to any
        questions your team may have.</font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif"><br>
      </font></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">Kindest regards,</font=
></p>
    <p><font face=3D"Helvetica, Arial, sans-serif">Phoebe<br>
      </font></p>
  </body>
</html>

--------------fNf0i7ksF6iR3RXpy3OKuavz--

--------------m4C2lQ9CEb1Ql6Roklxoxecl
Content-Type: application/pgp-keys; name="OpenPGP_0x9B3023BD4A39243B.asc"
Content-Disposition: attachment; filename="OpenPGP_0x9B3023BD4A39243B.asc"
Content-Description: OpenPGP public key
Content-Transfer-Encoding: quoted-printable

-----BEGIN PGP PUBLIC KEY BLOCK-----

xjMEZxO/yBYJKwYBBAHaRw8BAQdAlagvf+uRL4Ug5npHaABJElUWLw5OxRF9r8Vm
qCBus8jNJVBob2ViZSBEdXNpbCA8cGhvZWJlQGZsb3dlcmZpZWxkLmRldj7CkwQT
FgoAOxYhBDxqjXxo2Rs9dKIdc5swI71KOSQ7BQJnE7/IAhsDBQsJCAcCAiICBhUK
CQgLAgQWAgMBAh4HAheAAAoJEJswI71KOSQ7e6UBAMNPyq/fKCU6BC3KHcwN6ONZ
UKbdbtNkoOpQdDiFHZPAAP4/t6xhnBxC35aCdwW9lgrS3NBsbKPK4jjjwq8Bdc5i
DcKZBBMWCgBBAhsDBQsJCAcCAiICBhUKCQgLAgQWAgMBAh4HAheAFiEEPGqNfGjZ
Gz10oh1zmzAjvUo5JDsFAmcYOoAFCQWoFTgACgkQmzAjvUo5JDuo5gD+Na0s6aqw
IDR6qOkfbSfh3/liL9pvgALIDXcdSxiOlu0A+wdz4AAkZimjyQlaZ1VYcF6C9qB3
9A8alJ43kg8uUW4HzjgEZxO/yBIKKwYBBAGXVQEFAQEHQEzuHC8UPP86cSoa2V6G
fCoNJsauYEEAyUKdCiKUJWcxAwEIB8J4BBgWCgAgFiEEPGqNfGjZGz10oh1zmzAj
vUo5JDsFAmcTv8gCGwwACgkQmzAjvUo5JDt3IQD/XU5qzaYJrPTwjoK+oNzHYSN5
w+2pXJOqe+5czc1A+yUA/jbF2HpFzHqXubCK9aadEB+DjJ/nHSH+tQhcSS36ue0P
=3DsCtm
-----END PGP PUBLIC KEY BLOCK-----

--------------m4C2lQ9CEb1Ql6Roklxoxecl--

--------------FDXySm3eSRGq0eQWzxiUgbuc--

--------------81Crbut4NxK0WJp0kz00yQp0
Content-Type: application/pgp-signature; name="OpenPGP_signature.asc"
Content-Description: OpenPGP digital signature
Content-Disposition: attachment; filename="OpenPGP_signature.asc"

-----BEGIN PGP SIGNATURE-----

wnsEABYIACMWIQQ8ao18aNkbPXSiHXObMCO9SjkkOwUCZ7BvhQUDAAAAAAAKCRCbMCO9SjkkO/6e
AP4gMoazg/Yi7D+3fcUJs6MGQLL9lr7ThMSWhZeV69XzqQEAkH3Pa1Do+bGYcr4a4chzR1gfCh22
bs+Fv1JiJQz7vAI=
=K9lB
-----END PGP SIGNATURE-----

--------------81Crbut4NxK0WJp0kz00yQp0--
