OJ在线评测系统 原生Java代码沙箱程序漏洞讲解 原生超时资源权限控制

核心流程实现四 原生实现Java程序漏洞讲解

我们的程序并不安全

到目前为止 核心流程已经实现

但是想要上线 安全么

首先如果用户提交恶意代码怎么办

执行阻塞 占用资源不释放

程序卡死

注意类名要改为Main 包名一定要去掉

如果这种代码放到服务器中

会无限占用时间

package work.bigdata1421.dduojcodesandbox.unsafe;/*** 无限睡眠 阻塞程序的执行*/
public class SleepError {public static void main(String[] args) throws InterruptedException{long ONE_HOUR=60*60*1000L;Thread.sleep(ONE_HOUR);System.out.println("睡完了");}
}

占用内存 不释放

无限占用服务器时间

package work.bigdata1421.dduojcodesandbox.unsafe;import java.util.ArrayList;
import java.util.List;/*** 无限占用空间(浪费系统内存)*/
public class MemoryError {public static void main(String[] args) throws InterruptedException {List<byte[]> bytes = new ArrayList<>();while (true) {bytes.add(new byte[10000]);}}
}

实际运行中

我们会发现内存占用一定空间后 程序就会自动报错

堆内存溢出

这是JVM的一个保护机制

占用内存 不释放

我们可以设置JVM的启动内存

我们有一个工具 专门来计算JVM的内存的

JVisualVM工具 或者 Jconsole工具

可以连接到虚拟机上 动态的来查看JVM的状态 运行状态

读写文件

我们要写一个文件 读取到数据库的密码

我们可以写这样一个程序

也是不安全的

package work.bigdata1421.dduojcodesandbox.unsafe;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.List;/*** 读取服务器文件(文件信息泄露)*/
public class ReadFileError {public static void main(String[] args) throws InterruptedException, IOException {String userDir = System.getProperty("user.dir");String filePath = userDir + File.separator + "src/main/resources/application.yml";List<String> allLines = Files.readAllLines(Paths.get(filePath));System.out.println(String.join("\n", allLines));}
}

运行一下

发现读取出来了

写文件,越权植入木马

java -version 2>&1

向服务器写文件

package work.bigdata1421.dduojcodesandbox.unsafe;import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;/*** 向服务器写文件(植入危险程序)*/
public class WriteFileError {public static void main(String[] args) throws InterruptedException, IOException {String userDir = System.getProperty("user.dir");String filePath = userDir + File.separator + "src/main/resources/木马程序.bat";String errorProgram = "java -version 2>&1";Files.write(Paths.get(filePath), Arrays.asList(errorProgram));System.out.println("写木马成功,你完了哈哈");}
}

运行其他危险程序

直接通过Process执行危险程序

package work.bigdata1421.dduojcodesandbox.unsafe;import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;/*** 运行其他程序(比如危险木马)*/
public class RunFileError {public static void main(String[] args) throws InterruptedException, IOException {String userDir = System.getProperty("user.dir");String filePath = userDir + File.separator + "src/main/resources/木马程序.bat";Process process = Runtime.getRuntime().exec(filePath);process.waitFor();// 分批获取进程的正常输出BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));// 逐行读取String compileOutputLine;while ((compileOutputLine = bufferedReader.readLine()) != null) {System.out.println(compileOutputLine);}System.out.println("执行异常程序成功");}
}

Java原生超时资源权限控制

超时控制

判断运行时间

主线程在运行程序 我们可以新建一个线程 叫做监控线程

首先我们定义超时时间

// 定义超时时间
private static final long TIME_OUT = 10000L;

创建守护线程

先让线程睡一会

睡醒了直接杀死主线程

Process runProcess = Runtime.getRuntime().exec(runCmd);
// 超时控制
new Thread(() ->{try {Thread.sleep(TIME_OUT);System.out.println("超时了 中断");runProcess.destroy();}catch (InterruptedException e){e.printStackTrace();throw new RuntimeException();}
}).start();

限制给用户分配的资源

我们不能让每个Java进程的执行占用的JVM最大堆内存空间都和系统的一致

实际上应该小一点

比如说256MB

在启动JVM的参数 可以启动JVM的参数 -Xmx256m 最大堆空间大小 -Xms(初始堆空间大小)

可以保护系统

注意 -Xmx参数 JVM的堆内存限制 不等同与系统实际占用的最大内存 可能会超出

如果需要更严格的内存限制 要在系统层面去限制 而不是JVM层面的限制

如果是Linux系统 可以使用cgroup来实现对某个进程CPU 内存等资源的分配

限制代码 黑白名单

先定义一个黑白名单 比如那些操作是禁止的

// 定义黑白名单
private static final List<String> blackList = Arrays.asList("Files","exec");

危险代码其实都不用编译 直接在最开始进行校验

我们在开始的时候就用字典树进行校验

字典树是HuTool的一个工具类 WordTree

作用是可以用更小的空间存储更多的敏感词汇

实现更高效的敏感词查找

    private static final List<String> blackList = Arrays.asList("Files","exec");private static final WordTree wordTree;static {// 初始化字典树wordTree = new WordTree();wordTree.addWords(blackList);}

字典树的初始化

可以用静态代码块去执行

    private static final List<String> blackList = Arrays.asList("Files","exec");private static final WordTree wordTree;static {// 初始化字典树wordTree = new WordTree();wordTree.addWords(blackList);}

缺点1 你无法遍历所有的黑名单

缺点2 不同的变成语言 你对应的领域 关键词都不同 限制人工成本很大

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1548102.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

在GPU计算型实例中安装Tesla驱动超详细过程

摘要&#xff1a;在深度学习、AI等通用计算业务场景或者OpenGL、Direct3D、云游戏等图形加速场景下&#xff0c;安装了Tesla驱动的GPU才可以发挥高性能计算能力&#xff0c;或提供更流畅的图形显示效果。如果您在创建GPU计算型实例&#xff08;Linux&#xff09;时未同时安装Te…

[深度学习]循环神经网络

1 自然语言处理概述 语料&#xff1a;一个样本&#xff0c;句子/文章语料库&#xff1a;由语料组成词表&#xff1a;分词之后的词语去重保存成为词表 2 词嵌入层 import jieba import torch.nn as nn import torch # 文本数据 text北京东奥的进度条已经过半&#xff0c;不少外…

错误解决 ---- Unexpected lexical declaration in case block no-case-declarations

1. 报错提示 154:15 error Unexpected lexical declaration in case block no-case-declarations154:21 error resId is assigned a value but never used no-unused-vars158:15 error Unexpected lexical declaration in case block no-case-declarations158:21 e…

Java 使用 Graham 扫描的凸包(Convex Hull using Graham Scan)

先决条件&#xff1a; 如何检查两个给定的线段是否相交&#xff1f; c https://blog.csdn.net/hefeng_aspnet/article/details/141713655 java https://blog.csdn.net/hefeng_aspnet/article/details/141713762 python https://blog.csdn.net/hefeng_aspnet/article/details/…

C语言进阶【6】---结构体【1】(结构体的本质你不想了解吗?)

本章概述 结构体类型的声明结构体变量的创建和初始化结构体成员访问操作符彩蛋时刻&#xff01;&#xff01;&#xff01; 结构体类型的声明 咱们在讲操作符那个章节中&#xff0c;对于结构体类型的声明进行了讲解&#xff0c;咱们先来回忆一下&#xff0c;为后面的讲解作准备…

mac怎么设置ip地址映射

最近开发的项目分为了两种版本&#xff0c;一个自己用的&#xff0c;一个是卖出去的。 卖出的域名是和自己的不一样的&#xff0c;系统中有一些功能是只有卖出去的版本有的&#xff0c;但我们开发完之后还得测试&#xff0c;那就需要给自己的电脑配置一个IP地址映射了&#xf…

【机器学习(九)】分类和回归任务-多层感知机(Multilayer Perceptron,MLP)算法-Sentosa_DSML社区版

文章目录 一、算法概念二、算法原理&#xff08;一&#xff09;感知机&#xff08;二&#xff09;多层感知机1、隐藏层2、激活函数sigma函数tanh函数ReLU函数 3、反向传播算法 三、算法优缺点&#xff08;一&#xff09;优点&#xff08;二&#xff09;缺点 四、MLP分类任务实现…

JAVA毕业设计183—基于Java+Springboot+vue的旅游小程序系统(源代码+数据库)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue的旅游小程序系统(源代码数据库)183 一、系统介绍 本项目前后端不分离&#xff0c;分为用户、管理员两种角色 1、用户&#xff1a; 注册、登录、公告信息(…

解读: 火山引擎自研vSwitch技术

最近看到一篇文章介绍火山云的网络vSwitch技术&#xff0c;虽然是2022年的比较老的介绍&#xff0c;但是对于我们看到vSwitch技术的发展还是有些参考的。下面就截取了当时火山vSwitch关心的几个问题&#xff0c;做了一下梳理。 背景 在云计算发展过程中&#xff0c;虚拟网络的…

虚拟环境默认安装到C盘的修改办法

问题&#xff1a; 创建的虚拟环境默认安装到了C盘。 将路径改成D盘下。 解决办法&#xff1a; 我是按照博客w11下载anaconda在d盘&#xff0c;新建的虚拟环境总是在c盘怎么解决_如何保证anaconda的全在e盘-CSDN博客 中的方法1解决的。 用记事本打开.condarc文档&#xff0…

C++之STL—函数对象谓词

函数对象&#xff08;仿函数&#xff09; 函数对象(仿函数)是一个**类**&#xff0c;不是一个函数 类名&#xff08;&#xff09; 仿函数 直接调用&#xff1a; 、 谓词 定义&#xff1a;返回类型为bool 类型的仿函数 一元谓词&#xff1a;operator()接受一个参数 二元谓词&a…

JavaScript高级——事件循环模型

1、 2、所有代码分类 ① 初始化执行代码&#xff08;同步代码&#xff09;&#xff1a;包含绑定 dom 事件监听&#xff0c;设置定时器&#xff0c;发送 ajax 请求的代码 ② 回调执行代码&#xff08;异步代码&#xff09;&#xff1a;处理回调逻辑 3、js 引擎执行代码的基本流…

ubuntu系统下mamba-yolo模型的深度学习环境搭建

本文将介绍如何在ubuntu系统下配置目标检测模型mamba-yolo的深度学习环境 1. 环境要求 Python > 3.9 &#xff08;本文使用python-3.11&#xff09; CUDA > 11.6 &#xff08;本文使用CUDA-11.8&#xff09; Pytorch > 1.12.1 &#xff08;本文使用torch-2.4.0&…

【4.6】图搜索算法-DFS和BFS解合并二叉树

一、题目 给定两个二叉树&#xff0c;想象当你将它们中的一个覆盖到另一个上时&#xff0c;两个二叉树的一些节点便会重叠。你需要将他们合并为一个新的二叉树。合并的规则是 如果两个节点重叠&#xff0c;那么将他们的 值相加作为节点合并后的新值&#xff0c;否则不为 NUL L…

计算机视觉实战项目4(图像分类+目标检测+目标跟踪+姿态识别+车道线识别+车牌识别+无人机检测+A*路径规划+单目测距与测速+行人车辆计数等)

往期热门项目回顾&#xff1a; 计算机视觉项目大集合 改进的yolo目标检测-测距测速 路径规划算法 图像去雨去雾目标检测测距项目 交通标志识别项目 yolo系列-重磅yolov9界面-最新的yolo 姿态识别-3d姿态识别 深度学习小白学习路线 AI健身教练-引体向上-俯卧撑计数…

Vmware VC登录报错:Vmware报错 HTTP状态 500 - 内部服务器错误

问题现象&#xff1a; 登录Vmware VC系统报错&#xff1a;Vmware报错 HTTP状态 500 - 内部服务器错误、 然后登录管理服务&#xff08;访问端口&#xff1a;5480&#xff09;重启一下异常服务&#xff0c;结果提示证书过期。 初步判断VC SSL证书到期 判定方法&#xff1a; 1…

从源码到上线:轻松搭建您的地方门户分类信息平台 带完整的安装代码包以及搭建部署教程

系统概述 地方门户分类信息平台逐渐成为居民获取本地资讯、生活服务、商家信息、二手交易等多元化信息的重要渠道。然而&#xff0c;传统的信息平台搭建往往需要较高的技术门槛和较长的开发周期&#xff0c;这对于许多中小企业和个人开发者而言无疑是一大挑战。因此&#xff0…

ab压测工具进行流量测试

可以使用httpd服务携带的httpd-tools工具中的ab小的压测工具进行流量测试&#xff0c;服务端IP为192.168.6.1&#xff0c;并安装httpd服务&#xff0c;测试端安装httpd-tools工具。 1、服务端上安装httpd服务 [rootlocalhost ~]# yum install httpd -y [rootlocalhost ~]# s…

CKKS同态加密通用函数近似方法和openFHE实现

摘要 同态加密可以直接在密文上进行运算&#xff0c;尤其是CKKS&#xff0c;可以直接在实数的密文上进行运算。服务器可以利用强大的计算能力&#xff0c;在不泄露用户隐私的情况下&#xff0c;为用户提供便捷的外包运算服务。然而&#xff0c;CKKS只能进行算术运算&#xff0…

Word:表格公式计算

一、求和公式 以下演示是在windows操作系统环境&#xff0c;office软件进行操作的 SUM(LEFT) 全部步骤图如下&#xff1a; 步骤一 光标置于单元格&#xff0c;依次单击【表格工具-布局】→【数据】→【公式】 步骤二 在【公式】一栏中&#xff0c;默认的是“SUM(LEFT)”求和…