s
Java安全之log4j反序列化漏洞分析
https://www.cnblogs.com/nice0e3/p/14531327.html
http://blog.nsfocus.net/apache-log4j-deserialization-vulnerability/
北京时间18日清晨,Apache Log4j 被曝出存在一个反序列化漏洞(CVE-2017-5645)。攻击者可以通过发送一个特别制作的2进制payload,在组件将字节反序列化为对象时,触发并执行构造的payload代码。
该漏洞主要是由于在处理ObjectInputStream时,接收器对于不可靠来源的input没有过滤。可以通过给TcpSocketServer和UdpSocketServer添加可配置的过滤功能以及一些相关设置,可以有效的解决该漏洞。目前Log4j官方已经发布新版本修复了该漏洞。
【漏洞分析】
Apache Log4j-2是美国阿帕奇(Apache)公司的基于Apache Log4j框架进行重构和升级,引入了大量丰富的特性,可以控制日志信息输送的目的地为控制台、文件、GUI组件等,并通过定义每一条日志信息的级别,使其能更加细致地控制日志的生成过程。Apache Log4j2日志框架被大量用于业务系统开发,用来记录日志信息。当系统日志配置使用带有Context lookups的非默认Pattern Layout时,攻击者可构造包含递归查找的恶意输入数据,成功利用此漏洞将触发无限循环,最终导致系统崩溃。
相关地址:
http://cve.mitre.org/cgi-bin/cvename.cgi?name=%09CVE-2017-5645
https://issues.apache.org/jira/browse/LOG4J2-1863
http://seclists.org/oss-sec/2017/q2/78
受影响的版本
所有Apache Log4j 2.*系列版本:
- Apache Log4j 2.0-alpha1 – Apache Log4j 2.8.1
不受影响的版本
- Apache Log4j 2.8.2
规避方案
- 使用Java 7+的用户应立即升级至2.8.2版本或者避免使用socket server的相关类。
参考链接:
- 使用Java 6的用户应该避免使用TCP或者UDP 的socket server相关类,用户也可以手动添加2.8.2版本更新的相关代码来解决该漏洞。
参考链接:
https://git-wip-us.apache.org/repos/asf?p=logging-log4j2.git;h=5dcc192
MAVEN 引用方式: <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.0</version> </dependency> <artifactId>log4j-core</artifactId> <version>2.17.0</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-api</artifactId> <version>2.17.0</version> </dependency>
Log4j 1.x版 引发线程blocked死锁问题 / 使用apache log解决高并发下log4j引起大量线程block问题
http://www.aiprograming.com/b/pengpeng/23
http://zl378837964.iteye.com/blog/2373591
http://m.blog.csdn.net/article/details?id=52401328
Apache Log4j是一个基于Java的日志记录工具,用起来非常方便,但是Log4j 1.x如果使用不慎,会引起死锁问题,进行导致整个网站的宕机
WebLog Expert V5.6 Beta 3
http://wt.duote.com/soft/6057.html
http://70.duote.com.cn/wlexpert.exe
WebLog Expert 能够分析网站的流量记录,将原始的流量记录分析出Activity statistics、Access statistics、Information about visitors、Referrers、Information about errors等基本而重要的流量信息,帮助你了解网友对于你的网站的使用状况。
webloger digger ?
http://guoqinhua1986-126-com.iteye.com/blog/231244
********************LOG4J配置文件 log4j.properties***********
# Configure logging for testing: optionally with log file
log4j.rootLogger=WARN, stdout
# log4j.rootLogger=WARN, stdout, logfile
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.appender.logfile=org.apache.log4j.FileAppender
log4j.appender.logfile.File=target/spring.log
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
package com.idemfactor.crm.dao;
import java.util.List;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.LockMode;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.idemfactor.crm.model.Role;
/**
* Data access object (DAO) for domain model class Role.
*
* @see com.idemfactor.crm.model.Role
* @author MyEclipse Persistence Tools
*/
public class RoleDAO extends HibernateDaoSupport {
private static final Log log = LogFactory.getLog(RoleDAO.class);
// property constants
public static final String ROLE_NAME = "roleName";
protected void initDao() {
// do nothing
}
public void save(Role transientInstance) {
log.debug("saving Role instance");
getHibernateTemplate().save(transientInstance);
log.debug("save successful");
}
public void delete(Role persistentInstance) {
log.debug("deleting Role instance");
getHibernateTemplate().delete(persistentInstance);
log.debug("delete successful");
}
public Role findById(java.lang.Integer id) {
log.debug("getting Role instance with id: " + id);
Role instance = (Role) getHibernateTemplate().get(
"com.idemfactor.crm.model.Role", id);
return instance;
}
public List<Role> findByExample(Role instance) {
log.debug("finding Role instance by example");
List<Role> results = getHibernateTemplate().findByExample(instance);
log.debug("find by example successful, result size: " + results.size());
return results;
}
public List<Role> findByProperty(String propertyName, Object value) {
log.debug("finding Role instance with property: " + propertyName
+ ", value: " + value);
String queryString = "from Role as model where model." + propertyName
+ "= ?";
return getHibernateTemplate().find(queryString, value);
}
public List<Role> findAll() {
log.debug("finding all Role instances");
String queryString = "from Role";
return getHibernateTemplate().find(queryString);
}
public Role merge(Role detachedInstance) {
log.debug("merging Role instance");
Role result = (Role) getHibernateTemplate().merge(detachedInstance);
log.debug("merge successful");
return result;
}
public void attachDirty(Role instance) {
log.debug("attaching dirty Role instance");
getHibernateTemplate().saveOrUpdate(instance);
log.debug("attach successful");
}
public void attachClean(Role instance) {
log.debug("attaching clean Role instance");
getHibernateTemplate().lock(instance, LockMode.NONE);
log.debug("attach successful");
}
}
log4j.properties
log4j.rootLogger=info, stdout log4j.logger.com.idemfactor=debug log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=[%d{ISO8601}] %5p [%t] (%c{1}:%L) - %m%n #log4j.appender.R=org.apache.log4j.RollingFileAppender #log4j.appender.R.layout=org.apache.log4j.PatternLayout #log4j.appender.R.layout.ConversionPattern=[%d{ISO8601}] %5p [%t] (%c{1}:%L) - %m%n #log4j.appender.R.File=/tmp/fs.log #log4j.appender.R.MaxFileSize=1000KB #log4j.appender.R.MaxBackupIndex=7 # Need this to show all exception details in struts log4j.logger.org.apache.struts.action.ExceptionHandler=debug
end