Jiří Smolík created LOG4J2-3425:
-----------------------------------

             Summary: Syslog appender lacks the 'readTimeoutMillis' setting
                 Key: LOG4J2-3425
                 URL: https://issues.apache.org/jira/browse/LOG4J2-3425
             Project: Log4j 2
          Issue Type: Improvement
          Components: Appenders
    Affects Versions: 2.12.1
            Reporter: Jiří Smolík


Recently, we've had an issue with our syslog server (collector), where it was 
suddenly unable to forward messages sent to it. This resulted in flooding the 
server and ultimately, exhausting its resources (memory and allocated temporary 
storage).

However, more interestingly, Log4j2 appender behaved as follows:
 # At the moment of exhaustion, one thread (T1) entered the synchronized block 
in TcpSocketManager (see 
[here](https://github.com/apache/logging-log4j2/blob/e2ee2f4dd9327eb1841023c3269ba12f5673e694/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java#L217))
 and tried to write the message (see 
[here]([https://github.com/apache/logging-log4j2/blob/e2ee2f4dd9327eb1841023c3269ba12f5673e694/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java#L253)).|https://github.com/apache/logging-log4j2/blob/e2ee2f4dd9327eb1841023c3269ba12f5673e694/log4j-core/src/main/java/org/apache/logging/log4j/core/net/TcpSocketManager.java#L219)),]
 # The server didn't respond immediately - actually,  it blocked T1 for hours 
(it was most likely waiting for resources to be free).
 # In the meantime, all threads attempting to write a message to the syslog 
appender hanged at the synchronized block (they were waiting for T1 to finish).

Eventually, the connection to the server broke apart or some resources were 
freed, and T1 finished. Interestingly, it didn't throw any exception, but that 
is beside the point in this issue.

So, what happened is that the server got flooded and blocked one thread in our 
application, but due to the way TcpSocketManager is implemented, our 
application suffered a DoS.

As a precaution to such dreadful scenario, I would like to request adding a 
read timeout setting to the TcpSocketManager (also syslog appender), which 
would in case of the above described situation prevent T1 from blocking other 
threads for a long time. At least, that's my idea of an easy fix. Connect and 
reconnect timeout settings have a different purpose and were useless in this 
case.

I am aware that the issue is also a matter of the syslog server configuration, 
but application developers do not always have it under their control.



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

Reply via email to