收藏!使用eBPF技术审计和拦截文件读写操作

Linux阅码场 2024-10-29 10:10

导读:攻击者或恶意程序通常会通过尝试读取常见的各种配置文件内容的方式来获取系统内的敏感,以及会尝试更新特定系统文件的方式将攻击脚本长期驻留在被入侵的系统内。本文将介绍如何通过eBPF提供的各种主要特性实现审计和拦截文件读写操作的安全需求。

本文目录

一、  审计文件读写操作

1.  基于eBPF Kprobe和Kretprobe实现

2.  基于eBPF Tracepoint实现

3.  基于eBPF LSM实现

二、  拦截文件读写操作

1.  基于bpf_send_signal实现

2.  基于bpf_override_return实现

3.  基于eBPF LSM实现

三、总结

一、  审计文件读写操作

首先我们来看一下如何审计文件读写操作。我们可以通过追踪名为vfs_open的内核函数或追踪openat系统调用的方式审计文件读写操作。

我们首先确定一下审计文件读写操作需要审计的信息。简单起见,我们只审计关键的信息,主要包括如下信息。

 进程ID:发起文件读写操作的进程的ID。

 进程名称:发起文件读写操作的进程的名称。

 文件名称:被读写的文件的名称。

 文件打开模式:文件被打开时设置的模式信息。

确定了需要审计的内容后,下面将选择几个常见的代表性方法介绍如何使用eBPF特性实现文件读写操作的审计功能。

1.  基于eBPF Kprobe和Kretprobe实现

基于eBPFKprobe特性编写eBPF程序的前提是确定需要追踪的内核函数。对于文件读写操作,这里决定通过追踪内核函数vfs_open来实现。

(1)  内核函数签名

我们先来看一下vfs_open函数的签名。

int vfs_open(const struct path *path, struct file *file)


由vfs_open函数的签名可以看到,我们通过追踪这个函数能够获取到调用时传递的文件名称相关信息以及文件操作的参数信息。

(2)  获取事件参数

我们可以从path参数中获取打开的文件名称,关键点是如何从path->dentry->d_name中获取文件名称。获取文件名称的实现方法如下。

static void get_file_path(const struct path *path, char *buf, size_t size)


{
struct qstr dname;
dname = BPF_CORE_READ(path, dentry, d_name);
bpf_probe_read_kernel(buf, size, dname.name);
}
SEC("kprobe/vfs_open")
int BPF_KPROBE(kprobe_vfs_open, const struct path *path, struct file *file) {
// 省略部分代码
// 获取文件名称
get_file_path(path, event.filename, sizeof(event.filename));
// 省略部分代码
}


我们还可以直接从file参数中获取文件打开模式。

event.fmode = BPF_CORE_READ(file, f_mode);


确定了获取事件参数的方法后,eBPF程序最关键的逻辑就已经确定了。剩下的通过eBPFMap保存中间结果、获取函数执行结果、将完整的事件信息提交到环形缓冲区的逻辑,这里就不再赘述。

(3)  关键代码

通过追踪内核函数vfs_open实现审计文件读写操作的eBPF程序的关键代码如下。

static void get_file_path(const struct path *path, char *buf, size_t size)
{
struct qstr dname;
dname = BPF_CORE_READ(path, dentry, d_name);
bpf_probe_read_kernel(buf, size, dname.name);
}
SEC("kprobe/vfs_open")
int BPF_KPROBE(kprobe_vfs_open, const struct path *path, struct file *file) {
pid_t tid;
struct event_t event = {};
tid = (pid_t)bpf_get_current_pid_tgid();
event.pid = bpf_get_current_pid_tgid() >> 32;
bpf_get_current_comm(&event.comm, sizeof(event.comm));
// 获取打开模式
event.fmode = BPF_CORE_READ(file, f_mode);
// 获取文件名称
get_file_path(path, event.filename, sizeof(event.filename));
// 保存获取到的 event 信息
bpf_map_update_elem(&entries, &tid, &event, BPF_NOEXIST);
return 0;
}
SEC("kretprobe/vfs_open")
int BPF_KRETPROBE(kretprobe_vfs_open, long ret) {
pid_t tid;
struct event_t *event;
// 获取 kprobe_vfs_open 中保存的 event 信息
tid = (pid_t)bpf_get_current_pid_tgid();
event = bpf_map_lookup_elem(&entries, &tid);
if (!event)
return 0;
// 保存执行结果
event->ret = (int)ret;
// 将事件提交到 events 中供用户态程序消费
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, event, sizeof(*event));
// 删除保存的 event 信息
bpf_map_delete_elem(&entries, &tid);
return 0;
}


2.  基于eBPF Tracepoint实现

如前所述,我们也可以通过追踪系统调用openat实现审计文件读写操作的功能。因此,我们这里来看一下如何基于eBPFTracepoint特性通过追踪openat系统调用实现我们需要的审计功能。

(1)  获取事件参数

在编写基于Tracepoint实现的追踪openat系统调用的eBPF代码前,我们需要先查看一下sys_enter_openat事件的参数信息。

$ sudo cat /sys/kernel/debug/tracing/events/syscalls/sys_enter_openat/format
name: sys_enter_openat
ID: 638
format:
field:unsigned short common_type; offset:0; size:2; signed:0;
field:unsigned char common_flags; offset:2; size:1; signed:0;
field:unsigned char common_preempt_count; offset:3; size:1; signed:0;
field:int common_pid; offset:4; size:4; signed:1;

field:int __syscall_nr; offset:8; size:4; signed:1;
field:int dfd; offset:16; size:8; signed:0;
field:const char * filename; offset:24; size:8; signed:0;
field:int flags; offset:32; size:8; signed:0;
field:umode_t mode; offset:40; size:8; signed:0;

print fmt: "dfd: 0x%08lx, filename: 0x%08lx, flags: 0x%08lx, mode: 0x%08lx",
((unsigned long)(REC->dfd)), ((unsigned long)(REC->filename)), ((unsigned long)
(REC->flags)), ((unsigned long)(REC->mode))


由以上代码可知,我们可以从第2个参数中获取文件名称信息,可以从第4个参数中获取文件打开模式。

SEC("tracepoint/syscalls/sys_enter_openat")
int tracepoint_syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) {
// 省略部分代码
// 从 ctx->args[3] 中获取文件打开模式
event.fmode = (int)BPF_CORE_READ(ctx, args[3]);
// 从 ctx->args[1] 中获取被打开的文件名称
filename = (char)BPF_CORE_READ(ctx, args[1]);
bpf_probe_read_user_str(event.filename, sizeof(event.filename), filename);
// 省略部分代码
}


(2)  关键代码

获取到所需的参数信息后,我们就可以编写剩下的代码了。基于Tracepoint技术实现的追踪openat系统调用的eBPF程序的关键代码如下。

SEC("tracepoint/syscalls/sys_enter_openat")
int tracepoint_syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) {
pid_t tid;
struct event_t event = {};
char *filename;
tid = (pid_t)bpf_get_current_pid_tgid();
// 获取进程 ID
event.pid = bpf_get_current_pid_tgid() >> 32;
// 执行 openat 的进程名称
bpf_get_current_comm(&event.comm, sizeof(event.comm));
// 获取文件打开模式
event.fmode = (int)BPF_CORE_READ(ctx, args[3]);
// 从 ctx->args[1] 中获取被打开的文件名称
filename = (char)BPF_CORE_READ(ctx, args[1]);
bpf_probe_read_user_str(event.filename, sizeof(event.filename), filename);
// 保存获取到的 event 信息
bpf_map_update_elem(&entries, &tid, &event, BPF_NOEXIST);
return 0;
}
SEC("tracepoint/syscalls/sys_exit_openat")
int tracepoint_syscalls__sys_exit_openat(struct trace_event_raw_sys_exit *ctx) {
pid_t tid;
struct event_tevent;
// 获取 tracepoint_syscalls__sys_enter_openat 中保存的 event 信息
tid = (pid_t)bpf_get_current_pid_tgid();
event = bpf_map_lookup_elem(&entries, &tid);
if (!event)
return 0;
// 保存执行结果
event->ret = (int)BPF_CORE_READ(ctx, ret);
// 将事件提交到 events 中供用户态程序消费
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, event, sizeof(*event));
// 删除保存的 event 信息
bpf_map_delete_elem(&entries, &tid);
return 0;
}


3.  基于eBPF LSM实现

基于eBPF提供的LSM特性编写相应的事件处理程序也可以实现审计文件读写操作的功能。

(1)  启用LSM特性

通常情况下,我们使用的Linux发行版本即便内核版本已经大于等于5.7(内核从5.7版本开始支持eBPF LSM特性),默认也不会开启eBPF的LSM特性。但是,我们可以通过如下方法手动启用LSM特性。

1)确认内核配置中包含CONFIG_BPF_LSM=y配置项,如果未包含该配置项,则需要重新编译内核。

$ grep CONFIG_BPF_LSM /boot/config-$(uname -r)


CONFIG_BPF_LSM=y


2)确认/sys/kernel/security/lsm文件的内容中包含bpf配置项。

$ cat /sys/kernel/security/lsm


lockdown,capability,yama,apparmor,bpf


3)如果/sys/kernel/security/lsm文件的内容没有包含bpf配置项,可以通过下面的方法修改配置。

 修改配置文件/etc/default/grub中的GRUB_CMDLINE_LINUX配置,增加bpf配置项。

$ grep GRUB_CMDLINE_LINUX= /etc/default/grub


GRUB_CMDLINE_LINUX="lsm=lockdown,capability,yama,apparmor,bpf"


 更新GRUB配置。

sudo update-grub2


 重启系统。修改完配置后需要重启操作系统,新的配置才会生效。

在确保系统启用了eBPF LSM特性后,我们就可以开始编写基于eBPF LSM实现追踪文件读写操作的eBPF程序了。

(2)  确定追踪点

首先需要确认可以使用LSM提供的哪个追踪点实现我们的需求。可以在内核源码文件include/linux/lsm_hooks.h中查找可用的LSM追踪点,阅读源码后,我们决定使用file_open追踪点。file_open追踪点的说明如下。

 保存打开时的权限检查状态用于后续使用file_permission。

 如果在inode_permission的内容确定后发生了任何改变,则将重新检测访问权限。

 如果返回0则表示权限被允许。

(3)  获取事件参数

确认使用file_open追踪点后,我们来看一下这个追踪点事件的参数信息。可以在内核源码文件include/linux/lsm_hook_defs.h中获取到这个信息。

LSM_HOOK(int, 0, file_open, struct filefile)


由于上面的file参数是file结构体类型,因此我们可以从中获取被打开的文件名称及文件打开模式信息。

static void get_file_path(const struct file *file, char *buf, size_t size)
{
struct qstr dname;
dname = BPF_CORE_READ(file, f_path.dentry, d_name);
bpf_probe_read_kernel(buf, size, dname.name);
}
SEC("lsm/file_open")
int BPF_PROG(lsm_file_open, struct file *file) {
// 省略部分代码
// 获取打开模式
event.fmode = BPF_CORE_READ(file, f_mode);
// 获取文件名称
get_file_path(file, event.filename, sizeof(event.filename));
// 省略部分代码
}


(4)  关键代码

最后就可以基于上面这些信息编写eBPF程序了。基于eBPFLSM特性实现的审计文件读写操作的eBPF程序的关键代码如下。

static void get_file_path(const struct file *file, char *buf, size_t size)
{
struct qstr dname;
dname = BPF_CORE_READ(file, f_path.dentry, d_name);
bpf_probe_read_kernel(buf, size, dname.name);
}
SEC("lsm/file_open")
int BPF_PROG(lsm_file_open, struct file *file) {
struct event_t event = {};
event.pid = bpf_get_current_pid_tgid() >> 32;
bpf_get_current_comm(&event.comm, sizeof(event.comm));
// 获取打开模式
event.fmode = BPF_CORE_READ(file, f_mode);
// 获取文件名称
get_file_path(file, event.filename, sizeof(event.filename));
// 将事件提交到 events 中供用户态程序消费
bpf_perf_event_output(ctx, &events, BPF_F_CURRENT_CPU, &event, sizeof(event));
return 0;
}


二、  拦截文件读写操作

在实现拦截操作中,比较关键的一个步骤就是如何决策是否需要拦截当前事件。对于文件读写操作,假设我们只拦截通过cat命令打开文件的操作(仅作示例,实际场景下一般不用这种基于命令名称的判断作为决策),那么可以通过下面的方法判断文件读写事件是否满足被拦截的条件。

首先,我们需要定义两个函数,一个函数str_len用于获取字符串长度,另一个函数str_eq用于判断两个字符串是否相等。

static __always_inline bool str_eq(const char *a, const char *b, int len)


{
for (int i = 0; i < len; i++) {
if (a[i] != b[i])
return false;
if (a[i] == '\0')
break;
}
return true;
}
static __always_inline int str_len(char *s, int max_len)
{
for (int i = 0; i < max_len; i++) {
if (s[i] == '\0')
return i;
}
if (s[max_len - 1] != '\0')
return max_len;
return 0;
}


然后,我们再在eBPF程序中使用这两个函数检查进程名称,确认当前进程名称是否是需要拦截的名称。如果是,则执行拦截操作。

SEC("tracepoint/syscalls/sys_enter_openat")
int tracepoint_syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) {
// 省略部分代码
char target_comm[TASK_COMM_LEN] = "cat";
bpf_get_current_comm(&event.comm, sizeof(event.comm));
// 决策是否需要拦截当前事件
if (!str_eq(event.comm, target_comm, str_len(target_comm, TASK_COMM_LEN)))
return 0;
// 拦截操作
// 省略部分代码
}


1.  基于bpf_send_signal实现

借助bpf-helpers提供的辅助函数bpf_send_signal,我们同样可以实现拦截文件读写操作的需求。基于bpf_send_signal实现的拦截文件读写操作的关键代码如下。

SEC("tracepoint/syscalls/sys_enter_openat")
int tracepoint_syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) {
// 省略部分代码
// 决策是否需要拦截当前事件
if (!str_eq(event.comm, target_comm, str_len(target_comm, TASK_COMM_LEN)))
return 0;
// 拦截
long ret = bpf_send_signal(SIGKILL);
// 省略部分代码
}


2.  基于bpf_override_return实现

同样的,借助bpf-helpers提供的辅助函数bpf_override_return也可以实现拦截文件读写操作的需求。基于bpf_override_return实现的拦截文件读写操作的关键代码如下。

SEC("tracepoint/syscalls/sys_enter_openat")
int tracepoint_syscalls__sys_enter_openat(struct trace_event_raw_sys_enter *ctx) {
// 省略部分代码
// 决策是否需要替换返回值
if (!str_eq(event.comm, target_comm, str_len(target_comm, TASK_COMM_LEN)))
return 0;
// 保存要替换的返回值
bpf_map_update_elem(&override_tasks, &tid, &err, BPF_NOEXIST);
// 省略部分代码
}
SEC("kprobe/__x64_sys_openat")
int BPF_KPROBE(kprobe_sys_openat_with_override)
{
// 省略部分代码
// 查找是否需要替换返回值
tid = (pid_t)bpf_get_current_pid_tgid();
err = bpf_map_lookup_elem(&override_tasks, &tid);
if (!err)
return 0;
// 替换返回值
bpf_override_return(ctx, *err);
bpf_map_delete_elem(&override_tasks, &tid);
return 0;
}


3.  基于eBPF LSM实现

由前文eBPFLSM提供的file_open追踪点的说明可知,可以通过返回非0的方式在处理file_open事件的时候进行拦截操作。

了解这个信息后,要基于eBPFLSM实现拦截文件读写操作就比较简单了。修改后包含拦截逻辑的file_open事件处理函数的eBPF程序关键代码如下。

SEC("lsm/file_open")
int BPF_PROG(lsm_file_open, struct file *file) {
// 省略部分代码
// 决策是否需要拦截当前事件
if (!str_eq(event.comm, target_comm, str_len(target_comm, TASK_COMM_LEN)))
return 0;
// 省略部分代码
// 拦截
return -1;
}


上面的代码逻辑很简单,只是将返回值由之前的0改为-1就实现了拦截功能.

三、总结

本文介绍了如何使用eBPF技术实现审计文件读写操作,包括基于eBPF提供的Kprobe/Kretprobe、Tracepoint及LSM特性等方法,并探讨了如何使用bpf_send_signal和bpf_override_return辅助函数及LSM实现拦截文件读写操作。此外,我们还提供了各种方法的关键实现代码以供参考。如果您对eBPF技术的其他落地应用感兴趣,推荐您阅读黄竹刚、匡大虎老师的新书 eBPF云原生安全:原理与实践》。

本文摘编自《eBPF云原生安全:原理与实践》(书号:978-7-111-75804-4),经出版方授权发布,转载请保留文章来源。

eBPF云原生安全:原理与实践是一本系统讲解如何使用eBPF技术构建云原生安全防线的著作,是一本面向eBPF技术爱好者和云安全领域从业者的实战宝典,从原理与实践角度详述了eBPF技术在云原生安全领域正在发生的关键作用,是作者多年构筑云原生安全纵深防御经验的总结。本书详细阐述了eBPF技术的核心原理以及在云原生安全领域的应用价值,并结合大量的代码案例分析,深入探讨了在典型的云原生安全需求场景下使用eBPF技术可以帮助实现的安全功能和实践原理,同时也讲述了可能引入的安全风险,帮助读者从零基础快速了解eBPF技术,开始eBPF安全编程。

作者简介

黄竹刚,阿里云容器服务技术专家,eBPF技术爱好者,云原生安全领域从业人员,拥有十余年软件开发经验,熟悉Python、Go等多种编程语言,热爱开源并长期活跃于开源社区。

匡大虎,阿里云容器服务高级技术专家,曾就职于IBM和华为云。专注云原生安全,有十余年的云计算和容器安全攻防经验,负责阿里云容器服务团队安全产品能力的架构设计和研发工作。


Linux阅码场 专业的Linux技术社区和Linux操作系统学习平台,内容涉及Linux内核,Linux内存管理,Linux进程管理,Linux文件系统和IO,Linux性能调优,Linux设备驱动以及Linux虚拟化和云计算等各方各面.
评论
  • 应用趋势与客户需求,AI PC的未来展望随着人工智能(AI)技术的日益成熟,AI PC(人工智能个人电脑)逐渐成为消费者和企业工作中的重要工具。这类产品集成了最新的AI处理器,如NPU、CPU和GPU,并具备许多智能化功能,为用户带来更高效且直观的操作体验。AI PC的目标是提升工作和日常生活的效率,通过深度学习与自然语言处理等技术,实现更流畅的多任务处理、实时翻译、语音助手、图像生成等功能,满足现代用户对生产力和娱乐的双重需求。随着各行各业对数字转型需求的增长,AI PC也开始在各个领域中显示
    百佳泰测试实验室 2025-02-27 14:08 252浏览
  • Matter 协议,原名 CHIP(Connected Home over IP),是由苹果、谷歌、亚马逊和三星等科技巨头联合ZigBee联盟(现连接标准联盟CSA)共同推出的一套基于IP协议的智能家居连接标准,旨在打破智能家居设备之间的 “语言障碍”,实现真正的互联互通。然而,目标与现实之间总有落差,前期阶段的Matter 协议由于设备支持类型有限、设备生态协同滞后以及设备通信协议割裂等原因,并未能彻底消除智能家居中的“设备孤岛”现象,但随着2025年的到来,这些现象都将得到完美的解决。近期,
    华普微HOPERF 2025-02-27 10:32 212浏览
  •           近日受某专业机构邀请,参加了官方举办的《广东省科技创新条例》宣讲会。在与会之前,作为一名技术工作者一直认为技术的法例都是保密和侵权方面的,而潜意识中感觉法律有束缚创新工作的进行可能。通过一个上午学习新法,对广东省的科技创新有了新的认识。广东是改革的前沿阵地,是科技创新的沃土,企业是创新的主要个体。《广东省科技创新条例》是广东省为促进科技创新、推动高质量发展而制定的地方性法规,主要内容包括: 总则:明确立法目
    广州铁金刚 2025-02-28 10:14 103浏览
  • 在2024年的科技征程中,具身智能的发展已成为全球关注的焦点。从实验室到现实应用,这一领域正以前所未有的速度推进,改写着人类与机器的互动边界。这一年,我们见证了具身智能技术的突破与变革,它不仅落地各行各业,带来新的机遇,更在深刻影响着我们的生活方式和思维方式。随着相关技术的飞速发展,具身智能不再仅仅是一个技术概念,更像是一把神奇的钥匙。身后的众多行业,无论愿意与否,都像是被卷入一场伟大变革浪潮中的船只,注定要被这股汹涌的力量重塑航向。01为什么是具身智能?为什么在中国?最近,中国具身智能行业的进
    艾迈斯欧司朗 2025-02-28 15:45 221浏览
  • 振动样品磁强计是一种用于测量材料磁性的精密仪器,广泛应用于科研、工业检测等领域。然而,其测量准确度会受到多种因素的影响,下面我们将逐一分析这些因素。一、温度因素温度是影响振动样品磁强计测量准确度的重要因素之一。随着温度的变化,材料的磁性也会发生变化,从而影响测量结果的准确性。因此,在进行磁性测量时,应确保恒温环境,以减少温度波动对测量结果的影响。二、样品制备样品的制备过程同样会影响振动样品磁强计的测量准确度。样品的形状、尺寸和表面处理等因素都会对测量结果产生影响。为了确保测量准确度,应严格按照规
    锦正茂科技 2025-02-28 14:05 134浏览
  • RGB灯光无法同步?细致的动态光效设定反而成为产品客诉来源!随着科技的进步和消费者需求变化,电脑接口设备单一功能性已无法满足市场需求,因此在产品上增加「动态光效」的形式便应运而生,藉此吸引消费者目光。这种RGB灯光效果,不仅能增强电脑周边产品的视觉吸引力,还能为用户提供个性化的体验,展现独特自我风格。如今,笔记本电脑、键盘、鼠标、鼠标垫、耳机、显示器等多种电脑接口设备多数已配备动态光效。这些设备的灯光效果会随着音乐节奏、游戏情节或使用者的设置而变化。想象一个画面,当一名游戏玩家,按下电源开关,整
    百佳泰测试实验室 2025-02-27 14:15 137浏览
  • 1,微软下载免费Visual Studio Code2,安装C/C++插件,如果无法直接点击下载, 可以选择手动install from VSIX:ms-vscode.cpptools-1.23.6@win32-x64.vsix3,安装C/C++编译器MniGW (MinGW在 Windows 环境下提供类似于 Unix/Linux 环境下的开发工具,使开发者能够轻松地在 Windows 上编写和编译 C、C++ 等程序.)4,C/C++插件扩展设置中添加Include Path 5,
    黎查 2025-02-28 14:39 140浏览
  • 请移步 gitee 仓库 https://gitee.com/Newcapec_cn/LiteOS-M_V5.0.2-Release_STM32F103_CubeMX/blob/main/Docs/%E5%9F%BA%E4%BA%8ESTM32F103RCT6%E7%A7%BB%E6%A4%8DLiteOS-M-V5.0.2-Release.md基于STM32F103RCT6移植LiteOS-M-V5.0.2-Release下载源码kernel_liteos_m: OpenHarmon
    逮到一只程序猿 2025-02-27 08:56 195浏览
  • 在物联网领域中,无线射频技术作为设备间通信的核心手段,已深度渗透工业自动化、智慧城市及智能家居等多元场景。然而,随着物联网设备接入规模的不断扩大,如何降低运维成本,提升通信数据的传输速度和响应时间,实现更广泛、更稳定的覆盖已成为当前亟待解决的系统性难题。SoC无线收发模块-RFM25A12在此背景下,华普微创新推出了一款高性能、远距离与高性价比的Sub-GHz无线SoC收发模块RFM25A12,旨在提升射频性能以满足行业中日益增长与复杂的设备互联需求。值得一提的是,RFM25A12还支持Wi-S
    华普微HOPERF 2025-02-28 09:06 143浏览
  • 构建巨量的驾驶场景时,测试ADAS和AD系统面临着巨大挑战,如传统的实验设计(Design of Experiments, DoE)方法难以有效覆盖识别驾驶边缘场景案例,但这些边缘案例恰恰是进一步提升自动驾驶系统性能的关键。一、传统解决方案:静态DoE标准的DoE方案旨在系统性地探索场景的参数空间,从而确保能够实现完全的测试覆盖范围。但在边缘案例,比如暴露在潜在安全风险的场景或是ADAS系统性能极限场景时,DoE方案通常会失效,让我们看一些常见的DoE方案:1、网格搜索法(Grid)实现原理:将
    康谋 2025-02-27 10:00 252浏览
  • 更多生命体征指标风靡的背后都只有一个原因:更多人将健康排在人生第一顺位!“AGEs,也就是晚期糖基化终末产物,英文名Advanced Glycation End-products,是存在于我们体内的一种代谢产物” 艾迈斯欧司朗亚太区健康监测高级市场经理王亚琴说道,“相信业内的朋友都会有关注,最近该指标的热度很高,它可以用来评估人的生活方式是否健康。”据悉,AGEs是可穿戴健康监测领域的一个“萌新”指标,近来备受关注。如果站在学术角度来理解它,那么AGEs是在非酶促条件下,蛋白质、氨基酸
    艾迈斯欧司朗 2025-02-27 14:50 400浏览
  • 美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?美国加州CEC能效跟DOE能效有什么区别?CEC/DOE是什么关系?‌美国加州CEC能效认证与美国DOE能效认证在多个方面存在显著差异‌。认证范围和适用地区‌CEC能效认证‌:仅适用于在加利福尼亚州销售的电器产品。CEC认证的范围包括制冷设备、房间空调、中央空调、便携式空调、加热器、热水器、游泳池加热器、卫浴配件、光源、应急灯具、交通信号模块、灯具、洗碗机、洗衣机、干衣机、烹饪器具、电机和压缩机、变压器、外置电源、消费类电子设备
    张工nx808593 2025-02-27 18:04 120浏览
  •         近日,广电计量在聚焦离子束(FIB)领域编写的专业著作《聚焦离子束:失效分析》正式出版,填补了国内聚焦离子束领域实践性专业书籍的空白,为该领域的技术发展与知识传播提供了重要助力。         随着芯片技术不断发展,芯片的集成度越来越高,结构也日益复杂。这使得传统的失效分析方法面临巨大挑战。FIB技术的出现,为芯片失效分析带来了新的解决方案。它能够在纳米尺度上对芯片进行精确加工和分析。当芯
    广电计量 2025-02-28 09:15 116浏览
  • 一、VSM的基本原理震动样品磁强计(Vibrating Sample Magnetometer,简称VSM)是一种灵敏且高效的磁性测量仪器。其基本工作原理是利用震动样品在探测线圈中引起的变化磁场来产生感应电压,这个感应电压与样品的磁矩成正比。因此,通过测量这个感应电压,我们就能够精确地确定样品的磁矩。在VSM中,被测量的样品通常被固定在一个震动头上,并以一定的频率和振幅震动。这种震动在探测线圈中引起了变化的磁通量,从而产生了一个交流电信号。这个信号的幅度和样品的磁矩有着直接的关系。因此,通过仔细
    锦正茂科技 2025-02-28 13:30 100浏览
我要评论
0
点击右上角,分享到朋友圈 我知道啦
请使用浏览器分享功能 我知道啦