Lemmy: Rate limit bypass via X-Forwarded-For header spoofing in actix-web ConnectionInfo
Lemmy is a link aggregator and forum for the fediverse. Prior to 0.19.19 and 1.0.0-beta.1, actix-web ConnectionInfo::realip_remote_addr reads the first value of X-Forwarded-For as the client address used by raw_ip_key in crates/utils/src/rate_limit/mod.rs. Lemmy's bundled docker/nginx.conf uses $proxy_add_x_forwarded_for instead of $remote_addr, which appends the real client address to an X-Forwarded-For value supplied by the client. An unauthenticated attacker can therefore place a different spoofed address first on each request and receive a new rate-limit bucket, bypassing limits on POST /api/v4/account/auth/register, POST /api/v4/account/auth/login, POST /api/v4/post, POST /api/v4/comment, GET /api/v4/search, POST /api/v4/image, and POST /api/v4/account/import_settings. This permits excessive account creation, brute-force attempts, spam, scraping, uploads, and repeated imports. This issue is fixed in versions 0.19.19 and 1.0.0-beta.1.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-54738
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 18:32 UTC · Revision 1
Source evidence
Lemmy: Rate limit bypass via X-Forwarded-For header spoofing in actix-web ConnectionInfo
core-osv · Original sourcePublished 19 Aug 2026, 20:27 UTC
Lemmy is a link aggregator and forum for the fediverse. Prior to 0.19.19 and 1.0.0-beta.1, actix-web ConnectionInfo::realip_remote_addr reads the first value of X-Forwarded-For as the client address used by raw_ip_key in crates/utils/src/rate_limit/mod.rs. Lemmy's bundled docker/nginx.conf uses $proxy_add_x_forwarded_for instead of $remote_addr, which appends the real client address to an X-Forwarded-For value supplied by the client. An unauthenticated attacker can therefore place a different spoofed address first on each request and receive a new rate-limit bucket, bypassing limits on POST /api/v4/account/auth/register, POST /api/v4/account/auth/login, POST /api/v4/post, POST /api/v4/comment, GET /api/v4/search, POST /api/v4/image, and POST /api/v4/account/import_settings. This permits excessive account creation, brute-force attempts, spam, scraping, uploads, and repeated imports. This issue is fixed in versions 0.19.19 and 1.0.0-beta.1.
osv:CVE-2026-54738
Complete source record
{
"id": "3f0408f039f6354900385c9dff47480e683bdf4f654acf560b42130e65a4ccdf",
"url": "https://osv.dev/vulnerability/CVE-2026-54738",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Lemmy: Rate limit bypass via X-Forwarded-For header spoofing in actix-web ConnectionInfo",
"summary": "Lemmy is a link aggregator and forum for the fediverse. Prior to 0.19.19 and 1.0.0-beta.1, actix-web ConnectionInfo::realip_remote_addr reads the first value of X-Forwarded-For as the client address used by raw_ip_key in crates/utils/src/rate_limit/mod.rs. Lemmy's bundled docker/nginx.conf uses $proxy_add_x_forwarded_for instead of $remote_addr, which appends the real client address to an X-Forwarded-For value supplied by the client. An unauthenticated attacker can therefore place a different spoofed address first on each request and receive a new rate-limit bucket, bypassing limits on POST /api/v4/account/auth/register, POST /api/v4/account/auth/login, POST /api/v4/post, POST /api/v4/comment, GET /api/v4/search, POST /api/v4/image, and POST /api/v4/account/import_settings. This permits excessive account creation, brute-force attempts, spam, scraping, uploads, and repeated imports. This issue is fixed in versions 0.19.19 and 1.0.0-beta.1.",
"evidence": "osv:CVE-2026-54738",
"products": [],
"severity": "medium",
"structured": {
"id": "CVE-2026-54738",
"aliases": [
"CVE-2026-54738",
"GHSA-2hrg-7x4g-9vpg"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:L"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/lemmynet/lemmy",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "f6e986e7e54d456aa1ffec38f1576c5bb15e0afd"
},
{
"introduced": "87cbc2f3702bde803b313161321306a37af6ae3e"
},
{
"fixed": "fe8b39b10bb70e9c0edca2df7a63c8f8d4059c98"
},
{
"fixed": "41513c89ceecee719bff05acfe613e3b1e85f23c"
},
{
"fixed": "8b5b2aa78417b53ff3622c01f5bed2f1590f3b82"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "0.19.19"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"introduced": "1.0.0-alpha.5"
},
{
"fixed": "1.0.0-beta.1"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"fixed": "41513c89ceecee719bff05acfe613e3b1e85f23c"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "8b5b2aa78417b53ff3622c01f5bed2f1590f3b82"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "f6e986e7e54d456aa1ffec38f1576c5bb15e0afd"
}
],
"source": "REFERENCES_TAG",
"original_tag": "0.19.19"
},
{
"range": [
{
"fixed": "fe8b39b10bb70e9c0edca2df7a63c8f8d4059c98"
}
],
"source": "REFERENCES_TAG",
"original_tag": "1.0.0-beta.1"
}
]
}
}
],
"versions": [
"0.19.19-beta.1",
"0.19.19-beta.0",
"1.0.0-beta.0",
"1.0.0-alpha.19",
"1.0.0-alpha.18",
"0.19.18",
"0.19.18-beta.3",
"0.19.18-beta.1",
"0.19.18-beta.0",
"0.19.17",
"0.19.17-beta.0",
"0.19.16",
"0.19.16-beta.1",
"0.19.16-beta.0",
"0.19.15",
"0.19.15-beta.0",
"0.19.14",
"0.19.14-beta.2",
"0.19.14-beta.1",
"0.19.14-beta.0",
"1.0.0-alpha.12",
"1.0.0-alpha.10",
"0.19.13",
"1.0.0-alpha.9",
"0.19.13-beta.1",
"1.0.0-alpha.7",
"1.0.0-alpha.6",
"0.19.12",
"0.19.12-beta.12",
"0.19.12-beta.11",
"0.19.12-beta.10",
"0.19.12-beta.9",
"0.19.12-beta.8",
"0.19.12-beta.7",
"0.19.12-beta.6",
"0.19.12-beta.5",
"0.19.12-beta.4",
"1.0.0-alpha.5",
"0.19.12-beta.3",
"0.19.12-beta.2",
"0.19.12-beta.1",
"0.19.12-beta.0",
"0.19.11",
"0.19.11-beta.2",
"0.19.11-beta.1",
"0.19.11-beta.0",
"0.19.10",
"0.19.10-beta.2",
"0.19.10-beta.1",
"0.19.10-beta.0",
"0.19.9",
"0.19.9-beta.4",
"0.19.9-beta.3",
"0.19.9-beta.2",
"0.19.9-beta.1",
"0.19.9-beta.0",
"0.19.8",
"0.19.8-beta.0",
"0.19.7",
"0.19.7-beta.2",
"0.19.7-beta.1",
"0.19.6",
"0.19.6-beta.15",
"0.19.6-beta.14",
"0.19.6-beta.9",
"0.19.6-beta.8",
"0.19.5",
"0.19.5-alpha.3",
"0.19.5-alpha.2",
"0.19.5-alpha.1",
"0.19.4",
"0.19.4-rc.11",
"0.19.4-rc.10",
"0.19.4-rc.9",
"0.19.4-rc.8",
"0.19.4-rc.7",
"0.19.4-rc.6",
"0.19.4-rc.5",
"0.19.4-rc.4",
"0.19.4-rc.3",
"0.19.4-rc.2",
"0.19.4-rc.1",
"0.19.4-beta.8",
"0.19.4-beta.7",
"0.19.4-beta.6",
"0.19.4-beta.5",
"0.19.4-beta.4",
"0.19.4-beta.3",
"0.19.4-beta.1",
"0.19.3",
"0.19.3-rc.1",
"0.19.2",
"0.19.2-rc.5",
"0.19.2-rc.4",
"0.19.2-rc.2",
"0.19.2-rc.1",
"0.19.1-rc.2",
"0.19.1-rc.1",
"0.19.0",
"0.19.0-rc.16",
"0.19.0-rc.15",
"0.19.0-rc.14",
"0.19.0-rc.13",
"0.19.0-rc.12",
"0.19.0-rc.11",
"0.19.0-rc.10",
"0.19.0-rc.8",
"0.19.0-rc.7",
"0.19.0-rc.6",
"0.19.0-rc.5",
"0.19.0-rc.4",
"0.19.0-rc.3",
"0.19.0-rc.2",
"0.19.0-beta.7",
"0.19.0-rc.1",
"0.18.4-beta.7",
"0.18.1",
"0.18.1-rc.10",
"0.18.1-rc.9",
"0.18.1-rc.4",
"0.18.1-rc.1",
"0.18.0",
"0.18.0-rc.8",
"0.18.0-rc.6",
"0.18.0-rc.5",
"0.18.0-rc.4",
"0.18.0-rc.3",
"0.18.0-rc.2",
"0.18.0-rc.1",
"0.17.1",
"0.17.0",
"0.17.0-rc.4",
"0.17.0-rc.3",
"0.17.0-rc.1",
"0.16.5",
"0.16.3",
"0.16.3-rc.1",
"0.16.2",
"0.16.2-rc.3",
"0.16.2-rc.2",
"0.16.2-rc.1",
"0.16.1",
"0.16.1-rc.1",
"0.16.0",
"0.16.0-rc.4",
"0.16.0-rc.3",
"0.16.0-rc.2",
"0.16.0-rc.1",
"0.15.1",
"0.15.0",
"0.15.0-rc.7",
"0.14.3",
"0.14.2",
"0.14.2-rc.1",
"0.14.1",
"0.14.0",
"0.14.0-rc.2",
"0.14.0-rc.1",
"0.13.6-rc.2",
"0.13.5-rc.7",
"0.13.0",
"0.13.0-rc.1",
"0.12.0",
"0.12.0-rc.2",
"0.12.0-rc.1",
"0.11.4-rc.16",
"0.11.3-rc.4",
"0.11.0",
"0.11.2",
"0.11.1",
"0.11.0-rc.1",
"0.10.2",
"0.10.1",
"0.10.0",
"0.10.0-rc.13",
"0.10.0-rc.12",
"0.10.0-rc.7",
"0.9.9",
"0.9.8",
"0.9.7",
"0.9.6",
"0.9.5",
"0.9.4",
"0.9.3",
"0.9.2",
"0.9.1",
"0.9.0",
"v0.8.10",
"v0.8.9",
"v0.8.8",
"v0.8.7",
"v0.8.6",
"v0.8.5",
"v0.8.3",
"v0.8.1",
"v0.8.0",
"v0.7.64",
"v0.7.63",
"v0.7.62",
"v0.7.61",
"v0.7.59",
"v0.7.57",
"v0.7.56",
"v0.7.55",
"v0.7.54",
"v0.7.53",
"v0.7.52",
"v0.7.50",
"v0.7.49",
"v0.7.48",
"v0.7.43",
"v0.7.47",
"v0.7.46",
"v0.7.44",
"v0.7.42",
"v0.7.41",
"v0.7.40",
"v0.7.39",
"v0.7.38",
"v0.7.37",
"v0.7.36",
"v0.7.35",
"v0.7.34",
"v0.7.31",
"v0.7.33",
"v0.7.32",
"v0.7.26",
"v0.7.30",
"v0.7.29",
"v0.7.28",
"v0.7.25",
"v0.7.24",
"v0.7.23",
"v0.7.22",
"v0.7.21",
"v0.7.19",
"v0.7.20",
"v0.7.18",
"v0.7.17",
"v0.7.8",
"v0.7.7",
"v0.7.6",
"v0.7.5",
"v0.7.4",
"v0.7.3",
"v0.5.10",
"v0.4.0.3",
"v0.0.8.3",
"v0.0.8.2",
"v0.0.8.1",
"v0.0.7.4"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-54738.json"
}
}
],
"modified": "2026-10-28T02:30:38.475785427Z",
"provider": "osv",
"references": [
"https://github.com/LemmyNet/lemmy/releases/tag/0.19.19",
"https://github.com/LemmyNet/lemmy/releases/tag/1.0.0-beta.1",
"https://join-lemmy.org/news/2026-06-09_-_Lemmy_Release_v0.19.19",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54738.json",
"https://github.com/LemmyNet/lemmy/security/advisories/GHSA-2hrg-7x4g-9vpg",
"https://nvd.nist.gov/vuln/detail/CVE-2026-54738",
"https://github.com/LemmyNet/lemmy/commit/41513c89ceecee719bff05acfe613e3b1e85f23c",
"https://github.com/LemmyNet/lemmy/commit/8b5b2aa78417b53ff3622c01f5bed2f1590f3b82",
"https://github.com/LemmyNet/lemmy/pull/6574",
"https://github.com/LemmyNet/lemmy/pull/6575"
],
"provider_metadata": {
"cwe_ids": [
"CWE-799"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/54xxx/CVE-2026-54738.json"
}
},
"related_cves": [
{
"value": "CVE-2026-54738",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 505728,
"published_at": "2026-08-19T20:27:45.162+00:00"
}