Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

File/Rolling File appender doesn't guard against symlink attacks #388

Open
whiskeyjay opened this issue Aug 19, 2024 · 3 comments
Open

File/Rolling File appender doesn't guard against symlink attacks #388

whiskeyjay opened this issue Aug 19, 2024 · 3 comments

Comments

@whiskeyjay
Copy link

whiskeyjay commented Aug 19, 2024

The file/rolling appender should check for symlinks (or provide an option to turn the checking on/off) before writing or removing a log file.

A simplified repro on Windows (should be doable similarly on Linux):

  1. Create a symbolic link using PowerShell command:
    New-Item -Path C:\logs\intended_log_file.log -Target C:\test\Important_sys_file.sys -ItemType SymbolicLink
    Before running the command, make sure 1) C:\test\Important_sys_file.sys actually exists, you can just put an empty file there; 2) C:\logs\intended_log_file.log doesn't exist.
  2. Now run your app that uses log4rs with file appender that writes logs to C:\logs\intended_log_file.log.

You'll see the logs are actually being written to C:\test\Important_sys_file.sys. With rolling appender, files can be deleted by setting up symlinks.

If the Rust app runs with higher privilege than the attacker does, then it could be tricked into overwriting/deleting files the attacker normally wouldn't be able to get to.

I'm proposing to use the symlink_metadata function to check on the given log file path and make sure it is not a symlink to something else before writing or deleting. Would that make sense?

@bconn98
Copy link
Collaborator

bconn98 commented Aug 26, 2024

I'm taking a look at this. Give me a couple days to consider side effects, but I don't think I see an issue.

@bconn98
Copy link
Collaborator

bconn98 commented Aug 27, 2024

Some deeper consideration, symlink attacks are most often used as phishing schemes or something similar where the attacker owns both the executable and the configuration and the user is running with elevated permissions. Some information for those who find this thread in years to come more info here. Although, I do see the attack vector where the configuration is file based and an attacker replaces the config of a root level process with something malicious.

I tried digging into Log4j and Logback to see what their comments/feedback is on the issue, but haven't found much.

I guess my worry is a breaking change where someone might expect this behavior.

@whiskeyjay
Copy link
Author

Thanks for looking into it.

My understand of this method of exploitation is that the attacker doesn't necessarily need to own the executable, as long as the targeted executable has the privilege of writing to the intended target file.

I do believe in general app developers should do due diligence to eliminate factors needed to mount a successful symlink attack, like not making the app run as elevated just because it's easier. And hence there shouldn't be a default behavior change in the log4rs lib. Besides, some people might even leverage the symlink feature to redirect the log files.

However, in case of an app that must run elevated, as its developer, I would wonder "how do I know when I write logs to xyz.log, I'm really writing to xyz.log instead of being tricked to write to something else?". It would be nice to have a mechanism to opt-in for a symlink check if the calling code chooses/needs to.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants