2.1 线程安全 如果有多个线程在同时运行,而这些线程可能会同时运行这段代码。程序每次运行结果和单线程运行的结果是一样 的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 这种问题,几个窗口 ( 线程 ) 票数不同步了,这种问题称为线程不安全。 线程安全问题都是由全局变量及静态变量引起的。 要解决上述多线程并发访问一个资源的安全性问题 : 也就是解决重复票与不存在票问题, Java 中提供了同步机制 ( synchronized ) 来解决。 根据案例简述: 为了保证每个线程都能正常执行原子操作 ,Java 引入了线程同步机制。 那么怎么去使用呢?有三种方式完成同步操作: 1. 同步代码块。 2. 使用同步方法代码如下: 2.5 Lock锁 java.util.concurrent.locks.Lock 机制提供了比 synchronized 代码块和 synchronized 方法更广泛的锁定操作
声明 本文属于OneTS安全团队成员mes9s0的原创文章,转载请声明出处! 本文章仅用于学习交流使用,因利用此文信息而造成的任何直接或间接的后果及损失,均由使用者本人负责,OneTS安全团队及文章作者不为此承担任何责任。 对于Java反序列化漏洞来说,Java反射机制必须理解,本文专门用来说明究竟什么才是Java反射。 虚拟机如何加载获取的类 , Java 默认根据类名( 即类的绝对路径 , 例如 java.lang.Runtime( ) )来加载类,Runtime类在Java安全从零到一(3)中讲过 ) 其中 , 安全从零到一(2)中讲过,可以详细翻看。
Java安全之安全加密算法 0x00 前言 本篇文来谈谈关于常见的一些加密算法,其实在此之前,对算法的了解并不是太多。了解的层次只是基于加密算法的一些应用上。也来浅谈一下加密算法在安全领域中的作用。 SHA 安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。 BASE64 因为BASE64的加密解密算法是公开的,所以加密数据是没有任何安全性可言。先来看看API文档中提供的BASE64加密的类。 DES DES的算法其实已经被公开了,其实是不太安全的。 0x05 结尾 在安全中其实加密算法显得格外的重要,举个例子,比如说冰蝎,为什么就能过一些设备呢?其实分析过冰蝎的,或者是看过冰蝎作者大大的文章的应该会知道,冰蝎在流量传输中也是做了加密的。
那么你的线程是安全的吗?线程安全的原理又是什么呢? (本文内容是个人学习总结浅见,如有错误的地方,望大佬们轻拍指正) 2 线程安全 了解线程安全的之前先来了解一下 Java 的内存模型,先搞清楚线程是怎么工作的。 2.1 Java 内存模型 - JMM JMM(Java Memory Model),是一种基于计算机内存模型(定义了共享内存系统中多线程程序读写操作行为的规范),屏蔽了各种硬件和操作系统的访问差异的, 那么 Java 是如何来解决上述问题来保证线程安全,保证共享内存的原子性、可见性、有序性的呢? 3 线程同步 Java 提供了一系列的关键字和类来保证线程安全 3.1 Synchronized 关键字 保证方法或代码块操作的原子性 Synchronized 保证⽅法内部或代码块内部资源(数据)的互斥访问
Java本身对RMI规范的实现默认使用JRMP协议,而在Weblogic中使用T3协议 JNDI(Java Naming and Directory Interface):Java命名和目录接口。 ; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RemoteException; public Server的目标端口发起请求,并正式调用远程方法 远程调用报错 Client和Server的package路径需要一致 攻击RMI Registry 前面是RMI整个的原理与流程,那么RMI会带来哪些安全问题 官方文档:出于安全原因,应用程序只能绑定或取消绑定到在同一主机上运行的注册中心。这样可以防止客户端删除或覆盖服务器的远程注册表中的条目。但是,查找操作是任意主机都可以进行的。 RMI通信数据包:Java-Sec-RMI-rmi.pcapng.zip 参考文章: Java安全漫谈 基于Java反序列化RCE - 搞懂RMI、JRMP、JNDI Java安全之RMI反序列化 RMI
在学习Java语言的过程中,多线程是一个算是进阶的选择。我最近又学到了一个新技能ReentrantLock类,这个应该目前最简单的线程安全使用方式了,当然暴力synchronized除外。 首先回顾一下之前的线程安全常用同步类的文章: CountDownLatch类在性能测试中应用 CyclicBarrier类在性能测试中应用 Phaser类在性能测试中应用 Java线程同步三剑客 下面介绍一下 ReentrantLock真的是一个非常好用的多线程安全工具类。 这一点跟之前的文章如何mock固定QPS的接口、moco固定QPS接口升级补偿机制中用到的线程安全之流量控制类java.util.concurrent.Semaphore的使用基本一致,相比之下java.util.concurrent.locks.ReentrantLock ,这里用Java语言进行演示。
Java安全可以从反序列化漏洞开始说起,反序列化漏洞⼜可以从反射开始说起。 反射机制 可以获取到任何类的构造方法Constructors、成员方法Methods、成员变量Fields等信息 核心方法:基本上这⼏个⽅法包揽了Java安全⾥各种和反射有关的Payload。 先通过反射来获取其构造函数,再调用start()方法执行命令: package com.naraku.sec.reflection; import java.util.List; import java.util.Arrays String.class).invoke(cs.newInstance(), "open /System/Applications/Calculator.app"); } } 实例-沙盒绕过 在安全研究中 Java安全漫谈 Code-Breaking Puzzles — javacon WriteUp 版权属于:Naraku 本文链接:https://www.naraku.cn/posts/116.html
一、安全发布的定义 发布是一个动词,是去发布对象。而对象,通俗的理解是:JAVA里面通过 new 关键字 创建一个对象。 发布一个对象的意思是:使对象在当前作用域之外的代码中使用。 Demo-1: import java.util.HashSet; import java.util.Set; public class PublishExample { public static 2.1 this引用逸出 先看一个不安全发布的示例----this引用逸出。参考《Java并发编程实战》第3章程序清单3-7。 Java内存模型(JMM)定义了Happens-Before关系,用来判断程序执行顺序的问题。这个概念还是太抽象,下面会用具体的示例说明。 3.安全发布 安全发布由4种常见模式,接下来单独介绍各自线程安全的原因(模式1和模式3)。 注意事项:安全发布并不能保证在对象发布后的相关操作是线程安全的。
关于线程安全,是指当多个线程访问同一个变量时,该变量不会因为多线程访问产生意想不到的问题,为了避免多线程访问的不可预知的问题,对于程序中多线程能访问到的变量要加锁,即加synchronized,放在同步块中 当然jdk中自带的一些类本身就实现了该机制,本身就是线程安全的,比如StringBuffer,Vector等。多线程是程序中比较高级的一个方面,希望你能深入理解!
最近业务需要出一份Java Web应用源码安全审查报告, 对比了市面上数种工具及其分析结果, 基于结果总结了一份规则库. 本文目录结构如下: ? 弱加密 在安全性要求较高的系统中,使用不安全的加密算法(如DES、RC4、RC5等),将无法保证敏感数据的保密性。 Hash 在安全性要求较高的系统中,不应使用被业界公认的不安全的哈希算法(如MD2、MD4、MD5、SHA、SHA1等)来保证数据的完整性。 Java API中提供了java.util.Random类实现PRNG(),该PRNG是可移植和可重复的,如果两个java.util.Random类的实例使用相同的种子,会在所有Java实现中生成相同的数值序列 ,如java.security.SecureRandom类。
简介 如果我们在多线程中引入了共享变量,那么我们就需要考虑一下多线程下线程安全的问题了。那么我们在编写代码的过程中,需要注意哪些线程安全的问题呢? 一起来看看吧。 注意线程安全方法的重写 大家都做过方法重写,我们知道方法重写是不会检查方法修饰符的,也就是说,我们可以将一个synchronized的方法重写成为非线程安全的方法: public class SafeA UnsafeB extends SafeA{ @Override public void doSomething(){ } } 我们在实现子类功能的时候,一定要保持方法的线程安全性 答案是否定的,因为java会对代码进行重排序,所以childUnsafe2 = this的位置是不定的。
前段时间因为看JUC的源码,里面有大量关于unsafe的操作,所以就来看看了.写点笔记总结下(本文基于jdk1.8): unsafe可以帮我们直接去操作硬件资源,当然了是借助java的jit来进行的 ,官方不推荐使用,因为不安全,例如你使用unsafe创建一个超级大的数组,但是这个数组jvm是不管理的,只能你自己操作,容易oom,也不利于资源的回收. content.length,null,null); c.getMethod("getId").invoke(c.newInstance(), null); /** * 内存操作 * 可以在Java packThread.start(); TimeUnit.SECONDS.sleep(1); //注释掉下一行后,线程3秒数后进行输出,否则在1秒后输出 unsafe.unpark(packThread); /** * Java 使用直接内存分配,我们创建的数组大小受限于堆大小; * 实际上,这是堆外内存(off-heap memory)技术,在java.nio包中部分可用; * * 这种方式的内存分配不在堆上,且不受GC
java语言的反射机制。 java反射机制给漏洞利用提供了很多便利,我们可以在很多java漏洞的exp中看到它的影子,所以,学习java安全是绕不开它的。 0x02 前面我们知道了反射机制能够做什么,但是java具体是怎么实现这一点的呢? 中类的特征并提供了一些方法,Constructor抽象出了java中所有的构造函数的特征以及提供一些方法.... (最开始接触java安全的时候我就经常会被java的Class类型搞昏) 知道了这几个类之后,我们再回到怎么实现 调用一个对象的任意方法这个问题上来,分三步走: 首先获得这个对象对应的Class类的实例
欢迎关注微信公众号:数据科学与艺术 作者WX:superhe199 线程安全指的是在多线程环境下,共享的资源能够被正确地访问和操作,不会出现数据不一致或者异常的情况。 为了确保线程安全,可以采取以下几种方式: 使用互斥锁(mutex)或者信号量(semaphore)来保护共享资源的访问,确保同一时间只有一个线程能够操作共享资源。 使用线程安全的数据结构,如线程安全的队列、集合等。这些数据结构在设计时考虑了多线程操作的问题,能够保证在多线程环境下的安全性。 下面是一个简单的案例分析,展示如何确保线程安全: public class Counter { private int count = 0; public synchronized void 最终输出的结果应该是10000,如果没有线程安全措施,可能会出现不确定的结果。
线程安全 允许被多个线程同时执行的代码称作线程安全的代码。线程安全的代码不包含竞态条件。 线程安全出现问题的例子: 当多个线程同时操作一个变量时,可能会造成变量的脏读脏写(类似于mysql) package com.company; public class Main { public return a; } public void incA(){ a++; } } 执行结果: /Users/tioncico/Library/Java /JavaVirtualMachines/openjdk-14.0.1/Contents/Home/bin/java -javaagent:/Applications/IDE/IntelliJ IDEA.app 如何实现线程安全?
Java内存模型 Java内存模型(JMM)主要目标是定义多线程的情况下线程访问变量的规则。 关于线程安全 什么是线程安全问题? 当多个线程同时共享同一个全局变量做写的操作时候,可能会受到其他线程的干扰,导致数据脏读。(数据一致性问题) 如何解决线程安全问题? 通过加锁使线程更加安全,也使程序的执行效率更低。 衡量线程安全的3个要素: 原子性:一个操作或者多个操作要么全部执行,要么都不执行 可见性:多个线程访问同一变量,一个线程修改了变量的值,其他线程可以立即看到修改的值 有序性:程序按照代码的顺序先后执行 volatile能否保证线程安全? 不能,保证线程安全需要同时具备原子性,可见性和有序性。而volatile只能保证可见性和有序性,无法保证原子性。
简介 Java命名和目录接口(Java Naming and Directory Interface,缩写JNDI),是Java的一个目录服务应用程序接口(API),它提供一个目录系统,并将服务名称与对象关联起来 在 JDK 中包含了下述内置的目录服务: RMI: Java Remote Method Invocation,Java 远程方法调用; LDAP: 轻量级目录访问协议; CORBA: Common Object ; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; public 对象,通过Java序列化,或者 JNDI Reference 来存储。 的限制进行 JNDI 注入利用 | KINGX 探索高版本 JDK 下 JNDI 漏洞的利用方法 | 浅蓝 最后 JNDI 注入的漏洞的关键在于动态协议切换导致请求了攻击者控制的目录服务,进而导致加载不安全的远程代码导致代码执行
OpenJDK社区显著提升了Java的安全性,同时简化了软件工程师的开发流程。 译自 Java: Where the Wild Things Aren’t,作者 Erik Costlow。 过去十年,OpenJDK 社区显著提升了 Java 的用户安全性,同时简化了软件工程师的开发流程。这种结合减少了安全问题,并为处理所有软件中不可避免的安全问题提供了更清晰的流程。 及时更新的安全的 JDK Java 开发工具包每年发布四次,遵循预先发布的计划。每次发布都会进行标准改进,并修补任何新的安全风险。 一致的命名 在 2019 年初,Docker 上的主要 OpenJDK 分发版提供的是“神秘肉 Java”,这是一个与修补程序计划不同步的源代码版本,错过了各种安全修补程序,但仍然使用了包含安全漏洞的 结果,Docker 镜像的用户是不安全的,而已知下游 Java 分发的用户是安全的。
artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> Apache Commons项目的一个 Java 类库,提供了一组简单易用的API来操作 Java 对象和 Bean 属性。 它的主要功能是将Java Bean的属性值与一组键值对(例如,从HTTP请求或表单参数中)相互转换。主要对 JavaBean 功能的增强。以 Utils 结尾,一般这都是一个工具类/集。 JavaBean是一种特定的Java类,它遵循一定的规范和格式,以便于被其他程序使用和操作。 .*; import java.lang.reflect.Field; import java.util.Base64; import java.util.PriorityQueue; import java.util.Queue
Java作为企业主流开发语言已流行多年,各种java安全编码规范也层出不穷,本文将从实践角度出发,整合工作中遇到过的多种常见安全漏洞,给出不同场景下的安全编码方式。 总结 作为安全人员经常会被开发问如何修复漏洞,开发需要具体到某行代码如何改动,通过对常见漏洞的复现利用以及安全编码实践,可以加深安全人员对相关漏洞原理的理解,根据业务需要更具体地帮助开发人员写出健壮的代码 ,预防或修复安全漏洞。 参考资料 https://github.com/JoyChou93/java-sec-code/ 前面的常见注入类漏洞参考了这里的代码。 https://vulncat.fortify.com/en 后面的不安全加密模式,不安全随机数等配置漏洞参考fortify官方的漏洞知识库。