IPC 共享通俗讲解及其安全风险

server/2025/2/13 23:44:54/

IPC 共享,指的是进程间通信(IPC,Inter-Process Communication)中的数据共享方式。简单来说,它允许多个进程(程序)相互交换信息或共享数据。


为什么需要 IPC 共享?

在计算机中,进程是相互独立的,每个进程有自己的一片内存空间。默认情况下,一个进程不能访问另一个进程的数据。

但有时候,我们需要多个进程协作,比如:
浏览器的多个进程:Chrome 浏览器会为不同的标签页创建不同的进程,但这些进程需要共享一些数据,比如书签、历史记录等。
数据库访问:多个进程可能同时访问一个数据库,它们需要同步数据,防止冲突。
生产者-消费者模型:一个进程负责生产数据(生产者),另一个进程消费数据(消费者),它们需要共享一块数据区域进行交互。

如果没有 IPC 共享,每个进程只能“各过各的”,无法互相协作。所以,IPC 共享的本质就是让多个进程能高效、安全地共享数据


IPC 共享的几种方式

IPC 共享有多种不同的实现方式,常见的有:

IPC 方式适用场景共享特点
共享内存(Shared Memory)需要高效共享大数据直接在一块内存区域共享数据,最快的方式
消息队列(Message Queue)进程之间需要排队发送消息进程通过队列发送和接收消息
管道(Pipe)/命名管道(FIFO)父子进程通信或单向通信通过文件流方式传输数据,适合小数据
信号(Signal)进程间通知和中断进程可以向另一个进程发送信号,如 SIGTERM 终止进程
套接字(Socket)远程进程通信(网络)适用于网络或本地进程通信

下面详细介绍常见的 IPC 共享方式👇


1. 共享内存(Shared Memory)

概念

共享内存就是开辟一块特殊的内存区域,让多个进程可以访问这块区域,从而实现数据共享。

类比

就像家里有一个共享的“白板”,大家都可以在上面写字、擦除、修改信息,而不需要通过“邮寄”来交换数据。

特点

速度最快:直接读写内存,没有中间环节。
适合大数据传输:可以共享大块数据,而不像消息队列那样受限于队列长度。
需要同步机制:多个进程同时读写可能会产生冲突,需要使用**信号量(Semaphore)或互斥锁(Mutex)**来避免数据不一致。

示例

一个进程写入共享内存,另一个进程读取:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <string.h>int main() {key_t key = 1234;  // 共享内存的键int shmid = shmget(key, 1024, IPC_CREAT | 0666); // 创建共享内存char *data = (char*) shmat(shmid, NULL, 0);  // 连接到共享内存strcpy(data, "Hello, IPC Shared Memory!");  // 写入数据printf("写入共享内存: %s\n", data);shmdt(data); // 断开共享内存
}

另一个进程读取:

#include <stdio.h>
#include <sys/ipc.h>
#include <sys/shm.h>int main() {key_t key = 1234; int shmid = shmget(key, 1024, 0666); // 连接已有的共享内存char *data = (char*) shmat(shmid, NULL, 0);printf("从共享内存读取: %s\n", data);shmdt(data); // 断开共享内存shmctl(shmid, IPC_RMID, NULL); // 删除共享内存
}

执行流程:

  1. 第一个进程 创建共享内存,并写入 "Hello, IPC Shared Memory!"
  2. 第二个进程 读取共享内存,得到相同数据。
  3. 共享内存仍然存在,直到显式删除。

2. 消息队列(Message Queue)

概念

消息队列就像一个“消息邮箱”,进程可以向里面发送消息,另一个进程可以从里面取出消息。

类比

你和朋友不能直接说话(不同进程),但可以用一个邮箱互相留信件(消息队列)。

特点

可以实现异步通信:一个进程发送消息后,不需要等对方处理完毕。
数据安全,不会被覆盖:不像共享内存那样需要额外同步机制。
速度比共享内存慢:因为涉及到内核队列管理。

示例

进程 1 发送消息:

#include <stdio.h>
#include <sys/msg.h>
#include <string.h>struct msg_buffer {long msg_type;char msg_text[100];
};int main() {key_t key = 1234;int msgid = msgget(key, IPC_CREAT | 0666); // 创建消息队列struct msg_buffer message;message.msg_type = 1;strcpy(message.msg_text, "Hello, IPC Message Queue!");msgsnd(msgid, &message, sizeof(message.msg_text), 0); // 发送消息printf("发送消息: %s\n", message.msg_text);
}

进程 2 读取消息:

#include <stdio.h>
#include <sys/msg.h>struct msg_buffer {long msg_type;char msg_text[100];
};int main() {key_t key = 1234;int msgid = msgget(key, 0666); // 连接已有消息队列struct msg_buffer message;msgrcv(msgid, &message, sizeof(message.msg_text), 1, 0); // 读取消息printf("收到消息: %s\n", message.msg_text);msgctl(msgid, IPC_RMID, NULL); // 删除消息队列
}

执行流程:

  1. 进程 1 发送 "Hello, IPC Message Queue!" 到消息队列。
  2. 进程 2 读取该消息,并从队列中移除。
  3. 消息队列仍然存在,直到显式删除。

渗透测试中的 IPC 共享攻击手法

在渗透测试(Penetration Testing)中,IPC 共享可以被用于信息收集、权限提升、进程注入、横向移动等攻击场景。攻击者可以利用 IPC 机制在进程间传递恶意数据、绕过安全检测、劫持敏感信息,甚至利用共享内存进行隐蔽的通信。

可能的攻击手法如下:

  • 本地提权:利用 IPC 读取高权限进程数据,如数据库密码、API 密钥。
  • 横向移动:攻击者可以利用 IPC 在不同进程中传播恶意数据,提高控制范围。
  • 隐蔽通信:恶意软件可以通过共享内存或消息队列作为后门,绕过常规流量检测。
  • 恶意注入:利用共享内存和 LD_PRELOAD 劫持合法进程的执行逻辑。

总结

IPC 共享的方式各有优缺点:

  • 共享内存(Shared Memory):最快,适合大数据,但需要同步机制。
  • 消息队列(Message Queue):适合进程间异步通信,但速度不如共享内存。
  • 管道(Pipe):适合父子进程,单向通信。
  • 信号(Signal):适合进程间简单通知,如终止、暂停等。
  • 套接字(Socket):用于远程进程通信(网络)。
IPC 方式可能的安全风险
共享内存(SHM)未设置权限,攻击者可读写,劫持进程数据或注入恶意代码
消息队列(MQ)安全验证,可能导致信息泄露或被篡改
管道(FIFO)进程数据可能被窃听,某些情况下可进行劫持
信号(Signal)低权限进程可向高权限进程发送恶意信号,如 SIGKILL
套接字(Socket)本地/远程通信可能被劫持,用于流量注入或MITM攻击

http://www.ppmy.cn/server/167460.html

相关文章

深度学习-利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断

下面将分别展示基于 PyTorch 框架&#xff0c;利用预训练的 ResNet 和 DenseNet 模型进行医学影像诊断以提高准确率的代码实现。以肺炎 X 光影像诊断为例&#xff0c;假设数据集已经按照训练集和测试集划分好&#xff0c;每个类别存放在不同文件夹中。 1. 安装必要的库 pip i…

Ai无限免费生成高质量ppt教程(deepseek+kimi)

第一步&#xff1a;打开deepseek官网&#xff08;DeepSeek) 1.如果deepseek官网网络繁忙&#xff0c;解决方案如下&#xff1a; (1)超算互联网:超算互联网 (2)秘塔AI搜索:https://metaso.cn/(开启长思考&#xff09; (3)纳米ai:https://bot.n.cn/ (4)使用easychat官网&#xff…

蓝桥杯算法日记|贪心、双指针

3412 545 2928 2128 贪心学习总结&#xff1a; 1、一般经常用到sort&#xff08;a&#xff0c;an&#xff09;&#xff1b;【a[n]】排序&#xff0c;可以给整数排&#xff0c;也可以给字符串按照字典序排序 2、每次选最优 双指针 有序数组、字符串、二分查找、数字之和、反转字…

Docker与容器交互——attach和exec

阅读《Docker 从入门到实践》时&#xff0c;读到“进入容器”这一章节&#xff0c;有两个主要 的命令&#xff0c;分别是&#xff1a; docker attach docker exec 其中提到一句话&#xff1a; 注意&#xff1a; 如果从这个 stdin 中 exit&#xff0c;会导致容器的停止。 …

[MFC] 使用控件

介绍如何使用控件&#xff0c;以及如何获取控件中的数值 check Box 添加点击事件&#xff0c;即选中和取消选中触发的事件 第一种方式是按照如下方式第二种方式是直接双击点击进去 void CMFCApplication1Dlg::OnBnClickedCheckSun() {// TODO: 在此添加控件通知处理程序代…

蓝桥杯备考:贪心算法简介

贪心算法就是企图用局部最优的策略找出全局最优步骤就是1&#xff0c;把解决问题的过程分成若干步。2&#xff0c;每一步都选择当前看起来最优的解法 。 3&#xff0c;希望得到全局最优的结果 比较经典的例题一个就是 找零问题 钞票种类[20,10,5,1]用最小的张数找零46的时候…

Android10 音频参数导出合并

A10 设备录音时底噪过大&#xff0c;让音频同事校准了下&#xff0c;然后把校准好的参数需要导出来&#xff0c;集成到项目中&#xff0c;然后出包&#xff0c;导出方式在此记录 设备安装debug系统版本调试好后&#xff0c; adb root adb remount adb shell 进入设备目录 导…

HTML 链接

HTML 链接 引言 HTML&#xff08;超文本标记语言&#xff09;是构建网页的基础&#xff0c;而链接是网页中不可或缺的元素。链接不仅能够连接到其他网页&#xff0c;还能实现网页内部内容的跳转。本文将详细介绍HTML链接的用法、属性以及如何实现链接的优化。 HTML链接的基本…