大家好!我是大聪明-PLUS!

这是有关嵌入式Linux安全性的文章的第二部分。

在第一部分中,我们讨论了一些安全概念、威胁建模、安全启动、代码和数据加密、加密密钥和密钥存储技术。

在第二部分中,让我们继续讨论提高嵌入式 Linux 设备安全性的技术,包括安全编码、静态分析工具、运行时保护、模糊测试工具、权限、Linux 功能、强制访问控制、沙盒、更新系统和网络安全。

本文的第一部分讨论了代码和数据的加密。但是,如果您运行的应用程序存在可能被利用的漏洞,那么仅通过加密来保护代码和数据是不够的。

这就是为什么我们需要保护应用程序安全。有很多技术可以做到这一点,首先是安全编码。

安全编码

如果应用程序具有攻击媒介(用户输入、配置文件、网络通信等),则可以利用错误来利用系统。

尤其是使用 C/C++ 等内存不安全语言编写的程序,缓冲区溢出等错误可能会被用于堆栈破坏和格式化字符串等攻击。

举个例子,这是一个在 Linux 内核(从 2.6.34 到 5.2.x 版本)中发现的缓冲区溢出漏洞,存在于 vhost 功能将 virtqueue 缓冲区转换为 IOV 的过程中。特权客户机用户能够在迁移过程中向主机传递长度无效的描述符,从而利用此漏洞提升其在主机上的权限。

 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
diff --git a/drivers/vhost/vhost.c b/drivers/vhost/vhost.c
index 34ea219936e3f..acabf20b069ef 100644
--- a/drivers/vhost/vhost.c
+++ b/drivers/vhost/vhost.c
@@ -2180,7 +2180,7 @@ static int get_indirect(struct vhost_virtqueue *vq, /* If this is an input descriptor, increment that count. */ if (access == VHOST_ACCESS_WO) { *in_num += ret;
- if (unlikely(log)) {
+ if (unlikely(log && ret)) { log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); log[*log_num].len = vhost32_to_cpu(vq, desc.len); ++*log_num;
@@ -2321,7 +2321,7 @@ int vhost_get_vq_desc(struct vhost_virtqueue *vq, /* If this is an input descriptor,* increment that count. */ *in_num += ret;
- if (unlikely(log)) {
+ if (unlikely(log && ret)) { log[*log_num].addr = vhost64_to_cpu(vq, desc.addr); log[*log_num].len = vhost32_to_cpu(vq, desc.len); ++*log_num;

该漏洞已注册为CVE-2019-14835,并于2019年修复。实际上,虚拟机(客户机)内的用户可以利用此漏洞获取主机的 root 权限。该漏洞(以及许多其他漏洞)在 Linux 内核中已经存在多年!

软件终究会存在 bug,但我们可以尝试减少 bug。为此,我们可以使用静态分析工具。

静态分析工具能够分析源代码(无需运行程序),从而在程序运行时遇到问题之前发现它们。这些工具可以发现诸如空指针引用、内存泄漏、整数溢出、越界访问、初始化前使用等等程序错误!

有很多优秀的开源工具(例如 cppcheck、splint、clang 等)和商业工具(例如 Coverity、PC-Lint 等)可用于静态代码分析,从编译器开始,它们通常内置有静态分析工具,会在编译代码时生成警告或错误。这就是为什么我们永远不应该忽略编译器警告,对吧?

总之,我不会在这里深入探讨静态分析工具。如果你感兴趣,可以看看“使用静态分析工具寻找漏洞”。因此,降低应用程序安全漏洞风险的第一步是切勿忽略编译器警告并使用静态分析工具。但有些漏洞在源代码级别很难识别,有时甚至无法识别。因此,我们可能需要在应用程序中添加运行时保护措施。

运行时保护

运行时保护使得对应用程序进行动态分析成为可能。这意味着您的程序将受到运行时执行的保护和检查。

例如,AddressSanitizer (ASan) 是一款非常有趣的插桩工具,由谷歌安全研究人员创建,用于识别 C 和 C++ 程序中的内存访问问题。在启用 AddressSanitizer 的情况下编译 C/C++ 应用程序的源代码时,该程序将在运行时进行插桩,以识别并报告内存访问错误。

另一个例子是地址空间布局随机化,这是一种计算机安全技术,它随机排列进程关键数据区域(文本、堆栈、堆、库等)的地址空间位置。因此,如果您关心嵌入式 Linux 设备的安全性,则应该启用 ASLR,至少在 Linux 内核中启用。

Valgrind是另一个非常有用的工具,可以帮助检测与内存相关的问题,如泄漏和数据争用。

当然,这其中也存在一些权衡。虽然这些工具可以在运行时识别错误和安全漏洞,但它们可能会影响应用程序性能,并使系统调试变得更加困难。

此外,要使用这些工具查找错误,你必须确保代码中存在错误的部分能够运行。更好的是,应用程序的测试覆盖率应该接近 100%。模糊测试工具或许能帮到你。

模糊测试是一种自动化软件测试技术,涉及向程序提供无效、意外或随机数据作为输入。

然后监视程序是否存在异常,例如崩溃、内置代码断言失败或潜在的内存泄漏。

有很多免费和开源的模糊测试工具可供使用,包括 AFL(美国模糊测试循环)和 syzkaller(Linux 内核模糊测试器)。

这正是安全研究人员和威胁行为者用来查找软件安全漏洞的工具。有时,他们甚至会自己编写模糊测试工具,而不是使用流行的框架。这样做是有代价的,因为一些安全研究人员在BugBounty平台上通过查找软件漏洞赚取了数百万美元。

因此,如果您关心安全性,请尝试使用模糊测试工具测试您的嵌入式 Linux 系统!

最终,模糊测试、静态分析和运行时保护等技术和工具将有助于显著减少软件中的错误数量。但这并不意味着您的软件发布时不会出现任何错误!软件总是会存在错误,因此我们需要另一层保护,以防软件被利用。这就引出了系统权限。

权限

缓解漏洞利用风险的一种方法是不要以 root(超级用户)权限运行程序!您应该利用操作系统的访问控制机制,以非特权用户身份运行进程,并在仅授予运行所需资源访问权限的组中运行进程。

这被称为最小特权原则,是设计安全系统的规则之一。应用程序应该仅以完成其工作所需的权限运行。

但问题是,有时我们需要“root 权限”来执行某些特权操作(例如设置系统时钟、使用 RAW 套接字等)。在这种情况下,我们需要以 root 身份运行程序,对吗?

错了!解决这个问题的一个方法是使用 Linux 的一项名为 capabilities 的功能。

Linux 功能

Linux 功能是针对以 root 权限运行的进程的细粒度访问控制系统。

Linux 内核将超级用户相关的权限划分为不同的单元,称为“能力”,这些能力可以单独启用或禁用。因此,我们的想法是编写一个程序,使其以 root 身份运行,但只启用完成工作所需的能力。

如果您正在运行利用 Linux 功能的 Linux 发行版,则可以使用getcap工具列出特定程序运行所需的功能:

$ getcap /usr/bin/ping
/usr/bin/ping = cap_net_raw+ep

虽然权限控制机制为进程提供了一部分可用的 root 权限,但它不够灵活。如果您需要对权限进行更严格的控制,可以考虑使用一种称为强制访问控制 (MAC) 的访问控制类型。

强制访问控制

Linux 传统上支持自主访问控制 (DAC)。DAC 是一种访问控制类型,它根据主体的身份和/或所属组(实际上就是我们习惯使用的用户和组标志)来限制对对象的访问。

另一种访问控制称为强制访问控制(MAC)。MAC 是指操作系统限制主体访问或对客体执行某种操作的能力的一种访问控制类型。

MAC 通过 Linux 安全模块 (LSM) 在内核中实现,该框架允许 Linux 内核支持多种计算机安全模型。

实现强制访问控制的两个最著名的 Linux 安全模块是 SELinux 和 AppArmor:

  • SELinux 是最流行(且最复杂)的 MAC 实现之一,最初由 NSA 开发,如今用于 Android 和 Fedora 等更大的项目。
  • AppArmor 也是一种流行且更加用户友好的 MAC 实现,由 Canonical 支持并用于一些 Linux 发行版,如 Ubuntu 和 Debian。

因此,如果您需要对进程权限进行细粒度的控制,您应该考虑使用 MAC 机制。

但有时限制权限不足以保护系统免受易受攻击的应用程序的攻击。沙盒可以用来缓解这种情况。

应用程序沙盒

沙盒可以将应用程序与系统的其余部分隔离。

Linux 内核中最古老的沙盒机制可能是chroot。但它在安全性方面用处不大,因为它只能隔离文件系统。

虚拟化是应用程序沙盒的另一种形式,但成本太高,尤其是在嵌入式系统中。

目前,嵌入式 Linux 中沙盒应用程序的两种可能解决方案是容器和可信执行环境 (TEE)。

容器

Linux 容器是一个极简文件系统,仅包含运行特定应用程序或应用程序组所需的软件组件。容器与系统其他部分完全隔离运行,仅共享内核。

容器运行时实现利用了 Linux 内核提供的一些功能,包括:

  • 命名空间:隔离 Linux 上进程的执行(PID、用户、网络连接、挂载点等)。
  • cgroups:允许按进程或进程组划分系统资源(CPU、内存、I/O)。
  • seccomp:允许限制进程可以执行的系统调用。

有几种工具可用于管理 Linux 中的容器,包括 LXC、Systemd-nspawn、Podman 和 Docker。

容器本身并不安全,但如果配置得当,我们可以限制容器内各个进程的权限,并控制它们之间的通信,从而减少攻击面,提高系统的安全性。

与安全模块(例如 AppArmor 或 SELinux)结合使用,我们可以大大增强系统的安全性。

但在基于容器的系统中,如果内核被攻破,整个操作系统都将面临风险。在这种情况下,可信执行环境(TEX)是另一层安全保障,可以帮助防止这种情况发生。

可信执行环境

可信执行环境 (TEE) 是一种环境,其中执行的代码和访问的数据在机密性(没有人可以访问数据)和完整性(没有人可以更改代码及其行为)方面受到隔离和保护。

在具有 TEE 的系统中,不可信应用程序 (UA) 在富执行环境 (REE) 上运行,可信应用程序 (TA) 在可信执行环境 (TEE) 上运行。只有在 TEE(安全环境)上运行的可信应用程序才能完全访问主处理器、外设和内存。硬件隔离可保护 TA 免受在主操作系统(非安全环境)上运行的不可信应用程序的攻击。

我们需要硬件支持来实现 TEE,这样我们就可以对硬件(总线、外设、内存区域、中断等)进行分区和隔离,以防止不受信任的应用程序访问受保护的资源。大多数现代处理器都内置了此功能(例如 ARM 的 TrustZone、RISC-V 的 MultiZone 和 Intel SGX)。

我们身边的许多设备都使用了可信执行环境 (TEE),包括智能手机、机顶盒、视频游戏机和智能电视。目前有一些商业化的 TEE 实现,例如 Kinibi、QSEE 和 iTrustee,以及一些开源实现,例如 Trusty 和 OP-TEE。TEE 可以很好地解决沙盒应用、加密密钥的存储和管理、凭证和敏感数据的存储和管理,以及数字版权信息的保护问题。

尽管我们已经看到了各种缓解措施,但一个拥有数百万行代码的操作系统肯定存在错误和漏洞!对于嵌入式系统和连接设备来说,建立更新系统至关重要,因为安全性是产品的关键特性。

更新系统应在产品开发的早期阶段进行设计,如果可能的话,应具有 OTA(无线)功能。

实施良好的更新系统给产品开发带来了一些真正的挑战,包括通信协议的安全性、更新过程的原子性、防电源故障、带宽和存储使用、回滚功能等。

嵌入式 Linux 的更新系统可以采用一些策略,包括:

  • 基于应用程序:易于实现,但操作系统的其余部分怎么办?
  • 基于包:更新图像很小,但更新是非原子的,并且包依赖性可能是一个问题。
  • 基于图像:使用 A/B 机制是一个很好的解决方案,问题可能是带宽和存储使用情况。
  • 基于容器:另一个不错的选择,有助于实现原子、电源故障安全、使用更少带宽、速度更快、停机时间最短且具有回滚能力的更新系统。

如果你正在进行 OTA 更新,你的设备需要网络连接(Wi-Fi、以太网等)。这意味着网络接口会增加系统的攻击面,你需要增加更多安全层来防御攻击。

网络安全

这里的规则很简单:尽可能减少攻击面。但这并不意味着实施起来很容易。但我们可以先关注一些容易实现的目标。

例如,关闭所有未使用/不需要的 TCP/UDP 端口(nmap等工具可以提供帮助),禁用所有未使用的协议(例如 IPv6、PPP 等),设置防火墙规则以防止入站/出站连接,防止 DoS 攻击,防止端口扫描等。

如果您需要与外部设备通信,请始终使用安全连接(VPN、反向 SSH、TLS、HTTPS 等),优先使用公钥认证进行远程连接并禁用以 root 身份登录。

最后,有几种技术可以提高网络安全,我可以写一整篇文章来阐述。我的目的只是提高大家对这个话题的认识,确保我们不会忽视它。

结论

这真是一段疯狂的旅程!在本文的第一部分,我们讨论了一些安全概念、威胁建模、安全启动、代码和数据加密、加密密钥以及密钥存储技术。在第二部分,我们讨论了安全编码、静态分析工具、运行时保护、模糊测试工具、权限、Linux 功能、强制访问控制、沙盒、更新系统以及网络安全。

虽然我没有深入研究这些技术的实现,但我想谈谈我们必须降低风险并实现更安全的嵌入式 Linux 设备的概念和资源。

在安全领域,有一个“纵深防御”的概念,这意味着我们需要始终拥有不止一层或多种类型的防御。想象一下,你是一座城堡的国王。你会如何保护你的城堡?你可以把城堡建在山顶上,建造高大的城墙,在城堡周围设置水坝,在城墙上设置弓箭手,在城堡内安排战士等等。这些都是层层防御。如果攻击者突破了一层防御,将不得不面对下一层,以此类推。

在开发嵌入式 Linux 设备时我们可以应用相同的概念!

说到底,100% 安全的系统是不存在的。攻击者只需一个漏洞就能攻陷设备。问题在于我们想让这个过程变得多么艰难。

因此,我们在设计时应该充分考虑安全性,并充分考虑其中的利弊。一个系统应该“足够安全”。我们应该遵循良好的安全实践,了解可用的技术和工具,并在需要时使用它们。

让我们保护我们的嵌入式 Linux 设备!

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

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue3+JS 复杂表单实战:从验证到性能优化的全流程方案

继上一篇分享组合式 API Hook 封装后,这次想聚焦前端开发中 “让人又爱又恨” 的场景 —— 复杂表单。不管是管理后台的配置表单,还是用户中心的多步骤提交,表单处理都占了业务开发的 40% 以上。这篇文章会从实际项目痛点出发,分享…

[特殊字符] Python在CentOS系统执行深度指南

文章目录1 Python环境安装与配置问题1.1 系统自带Python的限制1.2 安装Python 3的常见问题及解决方案1.3 SSL模块问题解决方案1.4 环境变量配置与管理1.5 软件集合(SCL)替代方案2 包管理与虚拟环境问题2.1 pip包管理器问题与解决方案2.2 虚拟环境的最佳实…

ptx 简介03,ldmatrix 的应用实例解析

1. 实例编译 运行 main.cu //nvcc -g -lineinfo -stdc17 -archnative main.cu -o main#include <iostream> #include <thrust/device_vector.h>/* ldmatrix.sync.aligned.shape.num{.trans}{.ss}.type r, [p];.shape {.m8n8}; .num {.x1, .…

PostgreSQL 的核心优势数据库优化与面试问题解析

Part0: PostgreSQL 的核心优势PostgreSQL 的核心优势可以总结为&#xff1a;它不仅仅是一个关系型数据库&#xff0c;更是一个功能极其强大、设计高度严谨、且具有无限扩展潜力的数据平台。其核心优势主要体现在以下几个方面&#xff1a;1. 高度符合 SQL 标准与可靠性&#xff…

牛客周赛 Round 109 (小红的直角三角形

小红的直角三角形思路&#xff1a;当作向量来求&#xff0c;向量乘为0&#xff1b;#include<bits/stdc.h> #define ll long long #define endl "\n" using namespace std; typedef pair<ll, ll> pll; int n; vector<pll> u; void solve() {int x,…

efcore 对象内容相同 提交MSSQL后数据库没有更新

一、efcore 对象内容相同 提交MSSQL后数据库没有更新在.net6EFcore6环境&#xff0c;遇到一个问题&#xff0c;当界面UI传给EF的对象值没有变化&#xff0c;它居然不去更新数据库。那我有2个EFcore实例都在更新数据库&#xff0c;值一直不变&#xff0c;程序就更新不到数据库中…

DockerComposeUI+cpolar:容器管理的远程可视化方案

前言&#xff1a;DockerComposeUI作为Docker容器的可视化管理工具&#xff0c;通过直观的Web界面实现容器的启动、暂停、终止等操作&#xff0c;支持镜像管理和Compose文件编辑。特别适合开发团队和运维人员&#xff0c;其图形化操作简化了复杂的命令行操作&#xff0c;状态面板…

H5 页面与 Web 页面的制作方法

1. H5 页面制作使用 HTML5、CSS3 和 JavaScript 技术&#xff1a;这些技术支持创建交互式和响应式 H5 页面。使用 H5 编辑器或框架&#xff1a;如 Adobe Dreamweaver、Brackets 或 Ionic&#xff0c;这些工具提供了预先构建的模板和组件&#xff0c;简化了开发过程。考虑移动设…

1.6、机器学习-决策树模型(金融实战)

决策树是一种基于特征分割的监督学习算法,通过递归分割数据空间来构建预测模型。 1.1、决策树模型基本原理 决策树思想的来源朴素,程序设计中的条件分支结构就是 if-then结构,最早的决策树就是利用这类结构分割数据的一种分类学习方法。为了更好理解决策树具体怎么分类的,…

常见中间件的同步算法、CAP 默认倾向及自定义支持情况

文章目录CAP 概念1、比较2、关键说明&#xff1a;CAP 概念 CAP 定理指分布式系统无法同时满足​​一致性&#xff08;C​​onsistency&#xff09;、​​可用性&#xff08;​​A​​vailability&#xff09;、​​分区容错性&#xff08;​​P​​artition Tolerance&#xf…

Spring 中处理 HTTP 请求参数注解全解析

在 Spring 框架的 Web 开发中&#xff0c;处理 HTTP 请求参数是一项基础且重要的工作。除了 PathVariable、RequestParam 和 Valid RequestBody 外&#xff0c;还有一些其他注解也用于此目的。本文将对这些注解进行全面的区分和解析&#xff0c;帮助开发者在实际项目中更准确地…

【代码随想录算法训练营——Day11】栈与队列——150.逆波兰表达式求值、239.滑动窗口最大值、347.前K个高频元素

LeetCode题目链接 https://leetcode.cn/problems/evaluate-reverse-polish-notation/ https://leetcode.cn/problems/sliding-window-maximum/ https://leetcode.cn/problems/top-k-frequent-elements/ 题解 150.逆波兰表达式求值、 不能用tokens[i] > "0" &&…

Docker 容器化部署核心实战——镜像仓库管理与容器多参数运行详解

摘要&#xff1a; 在当今云原生技术迅速发展的背景下&#xff0c;Docker 已成为应用容器化的首选工具。本文作为“Docker 容器化部署核心实战&#xff1a;从镜像仓库管理、容器多参数运行到 Nginx 服务配置与正反向代理原理解析”系列的第一篇&#xff0c;将深入探讨 Docker 镜…

ESP8266无法连接Jio路由器分析

我查了一下关于这些 Jio 路由器型号&#xff08;尤其是 JCOW414 和 JIDU6801&#xff09;的公开资料&#xff0c;下面是我能拿到的内容 对比这些型号可能带来的问题&#xff0c;以及对你排障的补充建议。 路由器型号 & 公开已知特性 型号已知 / 可查特性和 ESP8266 的潜在…

传智播客--MySQL

DAY01 MySQL入门 第一章 数据库介绍 1.1 什么是数据库 数据存储的仓库&#xff0c;本质上是一个文件系统&#xff0c;作用&#xff1a;方便管理数据的。 1.2 数据库管理系统 数据库管理系统&#xff08;DataBase Management System, DBMS&#xff09;&#xff1a;指一种操作和管…

[Dify] 实现“多知识库切换”功能的最佳实践

在构建知识驱动的问答系统或 AI 助手时,一个常见需求是:根据用户问题所属领域或上下文,切换使用不同的知识库(Knowledge Base, KB)进行检索。这样可以提升回答的准确性、减少无关内容干扰,在多业务线或多主题应用中尤其有用。 本文将介绍: 为什么要做知识库切换 Dify …

Jenkins运维之路(Jenkins流水线改造Day02-2-容器项目)

上篇文章中已经将绝大部分&#xff0c;Jenkins容器项目打包的相关功能改造完成了&#xff0c;这里在对构建部署后的告警类操作进行一些补充1.流水线告警1.1 安装钉钉插件image-202509151111086851.2 配置钉钉插件image-20250915111235865image-202509151115328291.3 Pipeline钉…

64_基于深度学习的蝴蝶种类检测识别系统(yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)

目录 项目介绍&#x1f3af; 功能展示&#x1f31f; 一、环境安装&#x1f386; 环境配置说明&#x1f4d8; 安装指南说明&#x1f3a5; 环境安装教学视频 &#x1f31f; 二、数据集介绍&#x1f31f; 三、系统环境&#xff08;框架/依赖库&#xff09;说明&#x1f9f1; 系统环…

N1ctf-2025-PWN-ez_heap近队容器的礼仪

ez_heap 保护全开 程序逻辑&#xff1a; 读入0x30的字符串&#xff0c;进行字符串校验&#xff1a;以冒号为标志split&#xff0c;分成四份。最后输入字符串形如&#xff1a; xor 0x111111111111111 validate badmin:p64(xor)b:Junior:111111创建0x180的chunk存放note 结构体…

纵深防御实践:东方隐侠CI/CD安全体系构建全解析

前言:CI/CD安全的必要性 企业上云是近些年的潮流,但是风险如影随形。之前有家电商平台出了个大岔子——半夜自动发新版本的时候,因为流程里没做安全检查,直接导致系统故障,一天就损失了300多万。这还不算完,某银行测试人员通过未授权的自动发布流程把代码推到了生产环境…