realip_remote_addr behavior easily leads to insecure code

Open
#3,750 1 comment 0 reactions 0 assignees View on GitHub

Maintainers usually reply within 1 day

Nobody has claimed this yet.

Assessment

Difficulty
5/5
Estimated time
Over a week
Newbie friendliness
25/100
Issue type
Bug
Clarity
Needs clarification
Activity status
Stale
Tech stack
rust

Research direction

Start with the linked ConnectionInfo::realip_remote_addr documentation and compare its behavior with remote_addr and host. Review Werkzeug's linked ProxyFix middleware for its opt-in proxy and trusted-proxy handling. Done should include a settled configuration/API direction, coverage for direct and proxied requests, and documentation that makes unsafe unconditional use clear.

Written by the indexing model from the issue text.

Description

A-web C-improvement

https://docs.rs/actix-web/3.3.2/actix_web/dev/struct.ConnectionInfo.html#method.realip_remote_addr

This means that you have to use different functions depending on whether the application is behind a reverse proxy or not. But you tpyically do not want to recompile an application for something like this.

It would be much better if there was a config option indicating that the application is behind a proxy, and in that case have remote_addr return the correct one.

Realistically, there's a good chance that applications just use realip_remote_addr unconditionally, making it vulnerable to IP spoofing when it's not running behind a reverse proxy.

FWIW, the host logic seems to be similarly broken, since you can most likely pass a "bad" host header to an application if it's not behind a reverse proxy or that proxy does not filter out all the header this create uses.

FWIW, I recommend looking at how the ProxyFix middleware for the werkzeug Python web framework is implemented. It's opt-in, and lets you specify which proxy adds the data you want (in case of multiple proxies all adding to the headers).

Dominant language
Rust
Stars
24.9k
Forks
2k
Avg merge
19h 9m
Merged PRs (30d)
61

Getting set up

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

More from actix/actix-web

All issues in actix/actix-web

Similar issues

More Rust issues

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.