【论文阅读】UNICORN:基于运行时来源的高级持续威胁检测器(NDSS-2020)

UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats

NDSS-2020
哈佛大学
Han X, Pasquier T, Bates A, et al. Unicorn: Runtime provenance-based detector for advanced persistent threats[J]. arXiv preprint arXiv:2001.01525, 2020.
源码:UNICORN https://github.com/crimson-unicorn


目录

  • 0. 摘要
  • 1. 引言
  • 2. 背景
    • A. 系统调用跟踪的挑战
    • B. 全系统来源(Whole-System Provenance)
    • C. 总结和问题陈述
  • 3. 威胁模型
  • 4. 设计
    • A. 溯源图(Provenance Graph)
    • B. 构建直方图
    • C. 生成图摘要(graph sketch)
    • D. 学习进化模型
    • E. 异常检测
  • 5. 实现
  • 6. 评估


0. 摘要

  高级持续性威胁 (APT) 由于其 “低速” 攻击模式和频繁使用零日漏洞利用而难以检测。介绍了UNICORN,一种基于异常的 APT 检测器,可有效利用数据来源进行分析。

  • 通过广泛而高效的图分析,探索提供丰富上下文和历史信息的溯源图(provenance graphs),以识别没有预定义攻击签名的隐秘异常活动。
  • 使用图摘要(graph sketch)技术,它总结了长时间运行的系统执行和空间效率,以对抗发生在很长一段时间内的慢动作攻击。
  • 使用一种新颖的建模方法来进一步提高其检测能力,以了解系统演进时的长期行为。

  评估表明,UNICORN 优于现有的最先进的 APT 检测系统,并且可以高精度检测现实生活中的 APT 场景。




1. 引言

  传统的检测系统不太适合 APT。依赖于恶意软件签名的检测器对利用新漏洞的攻击视而不见;基于异常的系统通常分析一系列系统调用和日志相邻的系统事件,但其中大多数难以对长期行为模式进行建模。此外,它们容易受到规避技术的影响,因为它们通常只检查短序列的系统调用和事件。因此,他们在检测 APT 方面收效甚微。试图捕获长期程序行为的系统将其分析限制为事件共现(event co-occurrence ),以避免高计算和内存开销。

这个 “事件共现” 没太理解,应该是指:这些系统将分析行为限制在在事件高发时,以避免高开销。

  最近的工作表明数据来源可能是 APT 检测的更好数据源。

  数据来源将系统执行表示为有向无环图 (DAG),它描述了系统主体( subjects,例如进程)和对象(objects,例如文件和套接字)之间的信息流。它连接图中因果相关的事件,即使这些事件相隔很长时间。因此,即使受到 APT 攻击的系统通常表现得与未受攻击的系统相似,但溯源图中更丰富的上下文信息可以更好地区分良性和恶意事件。

  我们介绍了 UNICORN,一种基于来源的异常检测器。UNICORN 使用图摘要来构建可增量更新、固定大小的纵向图形数据结构,从而实现图形统计数据的高效计算。固定大小和可增量更新的图数据结构消除了溯源图对内存的依赖,它可以简洁地跟踪机器从启动到关机的整个来源历史(provenance history)。 UNICORN 在训练期间直接对系统的演化行为进行建模,但之后不会更新模型,从而防止攻击者毒化模型。

之前的基于溯源图的方案为了支持快速的图匹配,将溯源图放在内存。而溯源图是会随着系统行为而增长的,所以作者说固定的数据结构解决了溯源图对内存的依赖。

主要贡献如下:

  • 提出了一个针对 APT 攻击的基于起源的异常检测系统。
  • 引入了一种新颖的基于草图的时间加权起源编码,它紧凑并且能够有用地总结长期的起源图。
  • 根据模拟和真实的 APT 攻击场景评估 UNICORN。与之前的工作相比,UNICORN 将精确度和准确度分别显着提高了 24% 和 30%。



2. 背景

  传统的基于异常的入侵检测系统 (IDS) 分析来自审计系统的系统调用跟踪。然而,对于 APT 检测,全系统 provenance 是一个更好的数据源。

A. 系统调用跟踪的挑战

  系统调用抽象提供了一个简单的接口,用户级应用程序通过该接口请求操作系统的服务。作为调用系统服务的机制,系统调用接口通常也是攻击者试图破坏系统的切入点。因此,系统调用痕迹长期以来一直被视为入侵检测的事实上的信息来源。但是,现有系统捕获的系统调用审计日志的非结构化数据,需要进行分析才能理解。鉴于 APT 的低速和慢速特性,分析单个系统调用日志以检测逐点异常值通常是徒劳的,检查短系统调用序列也是如此。这种分析不反映每个系统调用事件的历史背景,导致高误报率和逃避检测的模仿攻击。相比之下, data provenance将历史背景编码为因果关系图。

   Data provenance可用于对计算中的各种事件序列建模,包括系统调用审计日志。事实上,存在从审计数据流中重建起源图结构的框架,以便更好地推理系统执行。然而,这种事后方法很难确保图的正确性;很难证明构建图形的系统调用跟踪的完整性、可信度或可靠性,因为许多系统调用插入技术都存在并发问题。此外,基于系统调用的起源框架生成的不是单一的系统执行图,而是许多断开连接的图,因为它们无法追踪不使用系统调用接口的内核线程之间的相互关系。因此,此类框架很少能检测到 APT 中发现的隐蔽恶意事件。

B. 全系统来源(Whole-System Provenance)

   全系统来源的收集在操作系统级别运行,捕获所有系统活动以及它们之间的交互。诸如 Hi-Fi、LPM和 CamFlow之类的操作系统级来源系统在信息流捕获方面提供了强大的安全性和完整性保证。这种完整性在 APT 场景中尤为可取,因为它可以捕获远距离因果关系,从而实现情境化分析,即使恶意代理操纵对安全敏感的内核对象以隐藏其存在也是如此。

   我们在整篇论文中使用 CamFlow 作为参考实现,并展示了 UNICORN 也可以与其他捕获机制无缝协作。

C. 总结和问题陈述

  先前的研究探讨了使用数据来源进行 APT 检测。然而,这些方法都受到以下限制的某些组合的影响:

  1. 预定义的边缘匹配规则过于敏感,难以检测 APT 中常见的零日攻击
  2. 溯源图仅提供对检测低调异常至关重要的信息上下文的有限理解
  3. 系统行为模型无法迎合APT攻击的独特特征。静态模型无法捕获长期运行系统的动态行为,而运行时的动态建模有被攻击者中毒的风险
  4. 溯源图仅在内存中存储和分析,从而牺牲了长期可扩展性

  UNICORN 解决了​​这些问题。我们将 APT 活动中的全系统入侵检测问题形式化为大型、属性、流式全系统溯源图上基于实时图的异常检测问题。在任何时间点,将从系统启动到当前状态捕获的整个溯源图与由已知良好溯源图组成的行为模型进行比较。如果系统的溯源图明显偏离模型,则系统被认为受到攻击。




3. 威胁模型

  我们假设用于主机入侵检测的 APT 场景:攻击者非法获得对系统的访问权限,并计划在不被发现的情况下长时间停留在那里。攻击者可以分几个阶段进行攻击,并在每个阶段使用各种技术。 UNICORN 的目标是通过解释主机生成的来源来检测任何阶段的此类攻击。

  我们假设,在攻击之前,UNICORN 在正常操作期间彻底观察了主机系统,并且在此初始建模期间没有攻击发生

  数据收集框架的完整性是 UNICORN 正确性的核心。我们假设 LSM 完整性是通过经过验证的启动序列提供的。我们对其他数据收集框架做出类似的完整性假设。

  对于本文的其余部分,我们假设内核、出处数据和分析引擎的正确性。




4. 设计

  UNICORN 是一种基于主机的入侵检测系统,能够同时检测对一组联网主机的入侵。图 1 说明了 UNICORN 的通用流程(general pipeline)。

  1. 获取流式溯源图
  2. 定期将图形特征汇总成直方图
  3. 创建固定大小的图摘要(graph sketches)
  4. 捕获系统执行的动态
    部署期间利用1、2、3创建模型,利用4检测

(1)将标记的流式溯源图作为输入
  UNICORN 接受由在一个或多个网络主机上运行的起源捕获系统产生的属性边缘流。起源系统构建了一个单一的、完整的系统起源 DAG,具有部分顺序保证,它允许高效的流计算和完全上下文化的分析。

(2)在运行时构建内存直方图(Builds at runtime an in-memory histogram)
  UNICORN 有效地构建一个流图的直方图,表示系统执行的整个历史。当新边到达图数据流时更新直方图元素的计数。通过迭代探索更大的图形邻域,以发现提供执行上下文的系统实体之间的因果关系。具体来说,直方图中的每个元素都描述了图的一个独特的子结构,同时包含了附加到子结构内的顶点和边的异构标签,以及这些边的时间顺序等信息。

  为了适应正常系统执行过程中预期的行为变化,UNICORN 会定期对与近期事件没有因果关系的直方图元素的影响进行衰减,并使用图中的信息流依赖关系来保持最新的重要相关上下文信息。慢慢地“忘记”不相关的过去事件使我们能够在整个系统正常运行期间(例如,系统启动、初始化、服务请求、故障模式等)有效地建模元状态。

(3)定期计算固定大小的图摘要(graph sketch)
  在纯的流式传输环境中,随着 UNICORN 汇总整个溯源图,唯一直方图元素的数量可以任意增长。这种大小的变化使得有效计算两个直方图之间的相似性变得具有挑战性。UNICORN 采用相似性保留散列技术将直方图转换为摘要。图摘要是可增量维护的且大小是恒定的,这意味着 UNICORN 不需要将整个溯源图保存在内存中。此外,图摘要保留了两个直方图之间的归一化 Jaccard 相似性,用于后面的聚类

(4)将摘要聚类到模型中
  UNICORN 构建一个正常的系统执行模型,并在没有攻击知识的情况下识别异常活动 。与传统的聚类方法不同,UNICORN 利用其流式处理能力来生成进化模型。该模型通过在执行的各个阶段对系统活动进行聚类来捕获单次执行中的行为变化,并且不会在运行期间动态修改模型,更适合在APT攻击风险下长期运行的系统。

A. 溯源图(Provenance Graph)

  审计日志分析通常依赖于时间关系,而来源分析则利用因果关系。起源图能够捕捉事件之间的因果关系,而因果连接有助于对时间上相距遥远的事件进行推理,因此有助于在 APT 的低速和缓慢攻击模式中导航,生成更有意义的系统行为模型。

  UNICORN 始终考虑整个溯源图来检测长期运行的攻击。存在许多图相似性度量,但许多方法(例如,图同构)限制性太强(即,要求两个图完全或大部分相同),因为即使是正常执行也经常会产生略有不同的溯源图。UNICORN 的图形相似性算法不会出现这些问题。

B. 构建直方图

  我们的目标是有效地比较起源图,同时容忍正常执行中的微小变化。我们对算法的两个标准是:1) 表示方法应考虑长期因果关系; 2) 我们必须能够在实时流图数据上实施该算法,以便我们可以在入侵发生时阻止它们(不仅仅是检测它们)

  我们采用基于同构的一维 WL 测试的线性时间、快速 Weisfeiler-Lehman (WL) 子树图核算法。我们对 WL 子树图形内核的使用取决于我们构建顶点直方图的能力,该直方图捕获每个顶点周围的图形结构。我们根据完全描述顶点 R-hop 邻域的增强顶点标签对顶点进行分类。我们通过迭代标签传播来构建这些增强的顶点标签

  假设我们有一个完整的静态图。在单个重新标记步骤中,首先我们将节点标签、其入边的标签以及所有这些边的源节点的标签作为输入,然后输出一个由所有输入标签聚合而成的该节点的新标签。我们对每个节点重复这个过程,然后将整个过程重复 R 次以构建描述 R-hop 邻域的标签。一旦我们为图中的每个节点构造了增强节点标签,我们就创建了一个直方图,直方图的每个柱对应于这些标签。同构的 WL 测试基于这些增强的顶点标签比较两个图;如果两个图在相似的标签集上具有相似的分布,则它们是相似的。

其实这个算法类似于标签传播策略,简单来说就是对于每一个节点,考虑其入边和入边的源节点,据此为该节点计算一个增强的标签,这个标签加入了其父亲节点的信息。重复执行R次之后,每个节点的增强标签就会携带其R代祖先的信息,以实现结合上下文的目的。

我们将静态图 G G G 定义为一个 5 元组 ( V , E , F v , F e , C ) , (V,E,{\mathcal{F}}^{v},{\mathcal{F}}^{e},{\mathcal{C}}), (V,E,Fv,Fe,C),,其中 V V V 是节点集, E E E 是有向边集,即 e = ( u , v ) ∈ E e=(u,v)\in E e=(u,v)E ( u , v ) ≠ ( v , u ) ∀ u , v ∈ V \mathbf(u,v)\neq(v,u)\forall u,v\in V (u,v)=(v,u)u,vV F v : V → Σ \mathcal{F}^v:V\to\Sigma Fv:VΣ 是一个函数,它将字母 Σ \Sigma Σ 中的标签分配给图中的每个节点,类似地, F e : E → Ψ {\mathcal{F}}^e : E → Ψ Fe:EΨ 将字母表 Ψ Ψ Ψ 中的标签分配给每条边。 C {\mathcal{C}} C 是记录每条边的时间戳的函数。在第 1 行中, R R R 是每个节点探索生成直方图元素的邻域跳数。 UNICORN 通过检查图中每个节点周围的有根子树来创建整个图的直方图。通过考虑这种非线性子结构,除了每个节点/边的属性之外,UNICORN 还保留了起源图的结构等价性,这已被证明优于随机游走等线性方法。 M M M 是节点 v v v 的相邻节点和/或边标签的列表,而 l i ( v ) l_i(v) li(v) 是节点 v v v 在第 i i i 次迭代(或 ( i − 1 ) (i-1) (i1) 跳邻域,其中 0-hop 邻域是顶点本身)。 T S TS TS 是相邻顶点的时间戳列表。在第 8 行中,函数 I n ( v ) In(v) In(v) 返回顶点 v v v 的所有入边,第 9 行中的函数 S o u r c e ( e ) Source(e) Source(e) 返回边 e e e 的源顶点。 T T T 记录每一个节点 v v v 的时间戳。在第 16 行中, N ( v ) = { w ∣ ( w , v ) ∈ E } \mathcal{N}(v)=\{w\mid(w,v)\in E\} N(v)={w(w,v)E} 是节点集, v v v 通过入边连接到这些节点。

  直方图的每个元素都对应一个唯一的顶点标签,该标签捕获顶点的 R-step 传入邻域。标签捕获有关邻域中的边和该邻域中顶点的身份的信息,包括揭示对象、主题和活动之间因果关系的复杂上下文信息。

  初始情况下,每个顶点都以其自己的初始标签为增强标签。然后,我们通过添加传入边的标签和这些边的源节点的初始顶点标签来合并 1-hop 邻居。在这个构建过程之后,每个顶点标签现在都代表顶点和边标签,这样当我们扩展到越来越大的邻域时,我们只需要为所有入边的源节点添加标签(因为这些标签已经包含了来自其传入边的边标签)。我们按照相应边的时间戳对所有标签进行排序,尊重系统中事件的顺序,然后对标签列表进行哈希处理,以方便快速查找和记录。一些顶点/边可能有多个标签,但相同的散列技巧允许以可忽略的成本进行多标签计算。

  流的可变性和算法复杂度。在流式传输环境中,我们仅在新到达的顶点和其传入邻域受新边影响的顶点上运行算法1。在每个溯源图实体或进程使用多个顶点来表示相应对象的不同版本或状态的起源图中,我们只需要计算/更新每个新边的目标顶点的邻域,因为所有传入边到一个顶点的时间在其到达任何传出边的顶点之前。 UNICORN 利用这种偏序来最小化计算开销(图 2)。因此,实际运行时复杂度大约等同于原始的一维 Weisfeiler-Lehman 算法:使用 R-hop 邻域,复杂度为 O ( R ∣ E ∣ ) O(R|E|) O(RE)

  虚线边在处理完所有实边后到达,虚线顶点是新到达的。如果起源图遵守偏序,则边 1 必须先于边 2 到达,并且只需要计算顶点 E 和 F 的局部结构。然而,在未观察到偏序的起源图中,我们可以在实边之后遇到边 3 和 4 以及新到达的顶点 G(红色虚线)。在这种情况下,R = 2,我们需要更新边 3 的顶点 C 和 E(D 的后代)以及边 4 的顶点 C、D 和 E(G 的后代)。
  这里没太懂这个偏序关系。

  概念漂移的削减。系统行为通常会随着时间的推移而发生变化,这会导致流式溯源图的底层统计属性发生变化。这种现象被称为概念漂移。

  UNICORN 根据年龄对现有数据的影响进行削减,通过在直方图元素计数上使用指数权重衰减来逐渐忘记过时的数据,从而解释系统行为的此类变化。分配的权重与数据的年龄成反比。对于直方图 H H H 中的每个元素 h h h,作为新数据项 x t x_t xt(即算法 1 第 23 行的散列标签 l i ( v ) l_i(v) li(v))在时间 t t t 流入,将 H h H_h Hh 计数为: H h = ∑ t w t 1 x t = h H_h=\sum_t w_t1_{x_t=h} Hh=twt1xt=h其中, w t = e − λ ∆ t w_t = e^{−λ∆t} wt=eλt。 UNICORN 随着添加到图中的边数单调递增 t t t

  在入侵检测场景中的适用性。逐渐遗忘的方法帮助 UNICORN 专注于系统执行的当前动态(即溯源图的最新部分),以及与当前执行有因果关系的图的部分(即R邻居) ,同时保持过去的“记忆”衰减,其速率由权重衰减因子 λ λ λ 控制。无论事件发生与系统执行的当前状态在时间上有多远,如果它与当前对象或活动有因果关系,则该事件及其周围的邻域将毫无折扣地对直方图做出贡献。因此,溯源图确保相关的上下文信息无论时间如何都保留在分析中。

C. 生成图摘要(graph sketch)

  与传统的基于直方图的相似性分析不同,UNICORN 在新边到达时不断更新直方图。测量流式直方图之间的相似性具有挑战性,因为直方图元素的数量不是先验的并且不断变化。此外,我们应该根据图特征的基本分布而不是绝对计数来衡量相似性。

  UNICORN 采用 HistoSketch ,一种基于一致加权采样的方法,可以有效地为流式直方图保持紧凑和固定大小的草图(sketch)。 HistoSketch 是一种恒定时间算法,因此它的速度足以支持对快速增长的起源图进行实时流分析。它还根据直方图的归一化、广义最小-最大 (Jaccard) 相似性无偏地近似直方图。

D. 学习进化模型

  UNICORN 在训练期间创建了一系列按时间顺序排列的草图。然后,它使用众所周知的 K-medoids 算法对来自单个服务器的草图序列进行聚类,使用轮廓系数来确定 K 的最佳值。簇代表系统执行的“元状态”,例如,启动、初始化、稳态行为。然后使用所有集群中草图的时间顺序和每个集群的统计数据(例如,直径、中心点)来生成系统演化的模型。

  算法2描述了进化模型的构建。每个草图 S ( t ) S(t) S(t) 属于索引为 k k k 的单个簇。演化 E E E 是集群索引的有序列表,其顺序由时间排序的草图 S ( t ) S(t) S(t) 确定。

  对于每个训练实例,UNICORN 创建一个模型,在其运行期间捕获系统执行状态的变化。直观上,这类似于跟踪系统执行状态的自动机。最终模型由来自训练数据中所有溯源图的许多子模型组成。通过进化建模,UNICORN 可以在多个时间点学习系统行为;使用逐渐遗忘方案,在任何时间点,UNICORN 都能够专注于最相关的活动。

其实这个进化建模是指会根据系统一段时间的行为而不是某一时刻的行为来建模,并不是说在运行过程中会不断演化。作者为了避免中毒,假设训练阶段是安全的。模型一经训练好便不再在运行中更改。

E. 异常检测

  随着直方图从流溯源图演变而来,UNICORN 会定期创建草图。给定一个溯源图的草图,UNICORN 将草图与建模期间学习的所有子模型进行比较,将其拟合到每个子模型中的一个簇。UNICORN 假设监控从系统启动开始,并跟踪每个子模型内的系统状态转换。要在任何子模型中被视为有效,草图必须适合当前状态或(其中之一)下一个状态(即,在草图捕获系统执行中的状态转换的情况下);否则,它被认为是异常的。因此,我们检测到两种形式的异常行为:不适合现有簇的草图和簇之间的无效转换。

简单来说,就是将建模期间的草图按时间排列,然后聚类成一个个簇,每个簇代表了一个元状态。由这些簇构成一个类似自动机的数据结构。检测期间的草图如果不属于任何一个簇或由当前状态进入了一个不可达状态,视为异常。




5. 实现

  GraphChi [75] 是一个基于磁盘的系统,可以在一台计算机上高效地计算具有数十亿条边的大型图。使用 GraphChi,UNICORN 无需将整个溯源图存储在内存中即可实现高效的分析性能。 UNICORN 依赖于 GraphChi 的两个重要特性:

  1. GraphChi 使用并行滑动窗口(PSW)算法将图拆分为碎片,每个碎片中的边数大致相同;它并行计算每个分片。该算法允许通过少量非顺序磁盘访问快速更新磁盘中的顶点和边。
  2. UNICORN 利用 GraphChi 对流图的高效计算。UNICORN 的保证偏序最小化了它访问的顶点数量,即使邻域跳跃参数 R 很大。批量添加边,而不是一次处理一条边,可以使处理速度更快。

[75] A. Kyrola, G. E. Blelloch, and C. Guestrin, “GraphChi: Large-scale graph computation on just a pc,” in Symposium on Operating Systems Design and Implementation. USENIX, 2012.

6. 评估

将UNICORN与StreamSpot进行了比较
三个真实的APT攻击数据集(CADETS、ClearScope、THEIA)来探索UNICORN的有效性
在受控的实验室环境中使用CamFlow创建了我们自己的模拟APT供应链攻击数据集(SC-1和SC-2)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/69387.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

行业追踪,2023-08-09

自动复盘 2023-08-09 凡所有相,皆是虚妄。若见诸相非相,即见如来。 k 线图是最好的老师,每天持续发布板块的rps排名,追踪板块,板块来开仓,板块去清仓,丢弃自以为是的想法,板块去留让…

【解密算法:时间与空间的博弈】

本章重点 ​​什么是数据结构? 什么是算法? 算法效率 时间复杂度 空间复杂度 常见时间复杂度以及复杂度oj练习 1. 什么是数据结构? 数据结构(Data Structure)是计算机存储、组织数据的方式,指相互之间存在一种或多种特定关系…

【React学习】—类式组件(六)

【React学习】—类式组件&#xff08;六&#xff09; <script type"text/babel">//创建类式组件class MyComponent extends React.Component{render() {// render是放在哪里的&#xff1f;MyComponent的原型对象上&#xff0c;供实例使用// render中的this是谁…

Debian 12.1 正式发布

导读Debian 12.1 现已发布&#xff0c;这是对稳定发行版 Debian 12&#xff08;代号 Bookworm &#xff09;的首次更新。本次发布主要增加了安全问题的修正&#xff0c;并对严重问题进行了一些调整。 一些更新内容包括&#xff1a; 妥善处理系统用户的创建&#xff1b;修复 eq…

08-3_Qt 5.9 C++开发指南_Graphics View绘图架构

文章目录 1. 场景、视图与图形项1.1 场景1.2 视图1.3 图形项 2. Graphics View 的坐标系统2.1 图形项坐标2.2 视图坐标2.3 场景坐标2.4 坐标映射 3. Graphics View 相关的类3.1 QGraphicsView 类的主要接口函数3.2 QGraphicsScene 类的主要接口函数3.3 图形项 4. 实例介绍 1. 场…

OPENCV C++(八)HOG的实现

hog适合做行人的识别和车辆识别 对一定区域的形状描述方法 可以表示较大的形状 把图像分成一个一个小的区域的直方图 用cell做单位做直方图 计算各个像素的梯度强度和方向 用3*3的像素组成一个cell 3*3的cell组成一个block来归一化 提高亮度不变性 常用SVM分类器一起使用…

到 2030 年API 攻击预计将激增近 1000%

导读云原生应用程序编程接口管理公司 Kong 联合外部经济学家的最新研究预计&#xff0c;截至 2030 年 API 攻击将激增 996%&#xff0c;意味着与 API 相关的网络威胁的频率和强度都显着升级。 这项研究由 Kong 分析师和布朗大学副教授 Christopher Whaley 博士合作进行&#x…

ubuntu20.04 docker 下编译 tensorflow-gpu

ubuntu20.04 安装tensorflow-gpu 配置&#xff1a; 系统 ubuntu 20.04 LTS 显卡 GTX 1060 6G 1 安装cudatoolkit &#xff08;我选 CUDA Toolkit 12.2 &#xff09; NVIDIA CUDA Installation Guide for Linux https://docs.nvidia.com/cuda/cuda-installation-guide-linux/in…

Vue3 —— reactive 全家桶及源码学习

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 上一篇学习了 ref 全家桶&#xff0c;在此基础上一起学习下 reactive 全家桶 一、reactive 对比 ref ref 可以接收 所有类型&#xff0c;reactive 只…

3分钟自建查分系统?现在每个人都可以实现了

学生成绩查询系统在现代教育管理中扮演着重要的角色&#xff0c;它不仅可以方便学生和家长查询成绩&#xff0c;也能帮助老师更好地管理和分析学生的学业表现。作为一名教师&#xff0c;了解如何制作学生成绩查询系统是提高教学效率和管理学生成绩便利性的关键。 在制作学生成…

数据结构笔记--链表经典高频题

目录 前言 1--反转单向链表 2--反转单向链表-II 3--反转双向链表 4--打印两个有序链表的公共部分 5--回文链表 6--链表调整 7--复制含有随机指针结点的链表 8--两个单链表相交问题 前言 面经&#xff1a; 针对链表的题目&#xff0c;对于笔试可以不太在乎空间复杂度&a…

深度学习之用PyTorch实现逻辑回归

0.1 学习视频源于&#xff1a;b站&#xff1a;刘二大人《PyTorch深度学习实践》 0.2 本章内容为自主学习总结内容&#xff0c;若有错误欢迎指正&#xff01; 代码&#xff08;类比线性回归&#xff09;&#xff1a; # 调用库 import torch import torch.nn.functional as F#…

手把手教你快速实现内网穿透

快速内网穿透教程 文章目录 快速内网穿透教程前言*cpolar内网穿透使用教程*1. 安装cpolar内网穿透工具1.1 Windows系统1.2 Linux系统1.2.1 安装1.2.2 向系统添加服务1.2.3 启动服务1.2.4 查看服务状态 2. 创建隧道映射内网端口3. 获取公网地址 前言 要想实现在公网访问到本地的…

【CSS】说说响应式布局

目录 一、是什么 二、怎么实现 1、媒体查询 2、百分比 3、vw/vh 4、小结 三、总结 一、是什么 响应式设计简而言之&#xff0c;就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本。 响应式网站常见特点&#xff1a; 同时适配PC 平板 手机等…

MacOS创建NetworkExtension 【保姆级流程】

MacOS创建NetworkExtension (保姆级流程) 因为自己工作中的项目&#xff0c;是运行在macos系统上&#xff0c;其中的一部分功能是通过NetworkExtension来获取系统中的流量来做相应的处理&#xff0c;所以也想自己创建一个NetworkExtension&#xff0c;三天&#xff0c;不知道踩…

Linux系统USB转串口芯片 GPIO使用教程

一、简介 WCH的多款USB转单路/多路异步串口芯片&#xff0c;除串口接口以外&#xff0c;还提供独立的GPIO接口&#xff0c;各GPIO引脚支持独立的输出输入&#xff0c;GPIO功能的使用需要与计算机端厂商驱动程序和应用软件配合使用。各芯片的默认GPIO引脚状态有所区别&#xff…

深入理解机器学习与极大似然之间的联系

似然函数&#xff1a;事件A的发生含着有许多其它事件的发生。所以我就把这些其它事件发生的联合概率来作为事件A的概率&#xff0c;也就是似然函数。数据类型的不同&#xff08;离散型和连续性&#xff09;就有不同的似然函数 极大似然极大似然估计方法&#xff08;Maximum Li…

【逗老师的PMP学习笔记】10、项目沟通管理

目录 一、规划沟通管理1、【关键工具】沟通技术2、【关键工具】沟通模型&#xff08;沟通模式&#xff09;3、【关键工具】沟通方法4、【关键工具】文化意识5、【关键输出】沟通管理计划 二、管理沟通1、【关键工具】会议管理 三、监督沟通 一、规划沟通管理 规划沟通管理是基于…

Java集合知识回顾:从分类到工具类,掌握精髓

文章目录 1. 集合的分类2. Collection 接口3. Map 接口4. 泛型5. Collections 工具类总结 在Java编程世界中&#xff0c;集合是一项极为重要的知识&#xff0c;为我们的程序设计提供了强大的数据结构和处理手段。在本篇文章中&#xff0c;我们将回顾集合的分类以及相关的重要概…

dotNet 之网络TCP

**硬件支持型号 点击 查看 硬件支持 详情** DTU701 产品详情 DTU702 产品详情 DTU801 产品详情 DTU802 产品详情 DTU902 产品详情 G5501 产品详情 ARM dotnet 编程 dotNet使用TCP&#xff0c;可以使用Socket和TcpClient 、TcpListener类 2种&#xff0c;对于高级用户&…