[ https://issues.apache.org/jira/browse/FLUME-2798?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Roshan Naik updated FLUME-2798: ------------------------------- Assignee: Phil D'Amore > Malformed Syslog messages can lead to OutOfMemoryException > ---------------------------------------------------------- > > Key: FLUME-2798 > URL: https://issues.apache.org/jira/browse/FLUME-2798 > Project: Flume > Issue Type: Bug > Components: Sinks+Sources > Affects Versions: v1.4.0, v1.5.0, v1.6.0 > Reporter: Phil D'Amore > Assignee: Phil D'Amore > Priority: Critical > Attachments: FLUME-2798.patch > > > It's possible for a client submitting syslog data which is malformed in > various ways to convince SyslogUtils.extractEvent to continually fill the > ByteArrayOutputStream it uses to collect the event until the agent runs out > of memory. Since the OOM condition affects the whole agent, it's possible > that a client sending such data (due to accident or malicious intent) to > disable the agent, as long as it remains connected. > Note that this is probably only possible using SyslogTcpSource although the > fix touches common code in SyslogUtils.java. > The issue can happen in two ways: > Scenario 1: Send a message like this: > {{<> some more stuff here}} > This causes a NumberFormatException: > {code} > Sep 11, 2015 2:27:07 AM org.jboss.netty.channel.SimpleChannelHandler > WARNING: EXCEPTION, please implement > org.apache.flume.source.SyslogTcpSource$syslogTcpHandler.exceptionCaught() > for proper handling. > java.lang.NumberFormatException: For input string: "" > at > java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) > at java.lang.Integer.parseInt(Integer.java:504) > at java.lang.Integer.parseInt(Integer.java:527) > at org.apache.flume.source.SyslogUtils.buildEvent(SyslogUtils.java:198) > at > org.apache.flume.source.SyslogUtils.extractEvent(SyslogUtils.java:344) > at > org.apache.flume.source.SyslogTcpSource$syslogTcpHandler.messageReceived(SyslogTcpSource.java:76) > at > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:268) > at > org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:255) > at org.jboss.netty.channel.socket.nio.NioWorker.read(NioWorker.java:94) > at > org.jboss.netty.channel.socket.nio.AbstractNioWorker.processSelectedKeys(AbstractNioWorker.java:364) > at > org.jboss.netty.channel.socket.nio.AbstractNioWorker.run(AbstractNioWorker.java:238) > at org.jboss.netty.channel.socket.nio.NioWorker.run(NioWorker.java:38) > at > java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) > at > java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) > at java.lang.Thread.run(Thread.java:745) > {code} > This exception does not get handled, and it happens before reset() can be > called. The result is that the state machine in SyslogUtils gets stuck in > the DATA state, and all subsequent data just gets appended to the baos, while > the above exception streams to the log. Eventually the agent runs out of > memory. > Scenario 2: Send some data like this: > {{<123...........}} > No length checking is done in the PRIO state so you could potentially fill > the agent memory this way too. > I'm attaching a patch which handles both of these issues and adds more > exception handling to buildEvent to make sure that reset() is called in > future unforeseen situations. > Thanks also to [~roshan_naik] for helping to make this patch better. -- This message was sent by Atlassian JIRA (v6.3.4#6332)