BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain

news2024/11/17 0:05:06

BadNets: Identifying Vulnerabilities in the Machine Learning Model Supply Chain----《BadNets:识别机器学习模型供应链中的漏洞》

 
背景: 许多用户将训练过程外包给云计算,或者依赖于经过训练的模型,然后根据特定的任务对模型进行微调。这样做存在一定的安全风险:攻击者创建一个经过恶意训练的网络(后门神经网络,或称为BadNet),该网络在用户的训练和验证样本上具有很好的性能,但在攻击者选择的特定输入上表现糟糕。
意义: 为进一步研究验证和检查神经网络的技术提供了动力。

摘要:

  基于深度学习的技术已经在各种各样的识别和分类任务上实现了最先进的性能。然而,这些网络的计算训练通常是昂贵的,需要在许多GPU上进行数周的计算;因此,许多用户将训练过程外包给云计算,或者依赖于经过训练的模型,然后根据特定的任务对模型进行微调。在本文中,我们展示了外包训练引入了新的安全风险:对手可以创建一个恶意训练的网络(后门神经网络,或称为BadNet),该网络在用户的训练和验证样本上具有最先进的性能,但在攻击者选择的特定输入上表现糟糕。我们首先在一个简单的示例中通过创建一个后门手写数字分类器来探索BadNets的属性。接下来,我们在一个更现实的场景中演示后门,通过创建一个美国街道标识分类器,当一个特殊的贴纸添加到停止标志时,将停止标志识别为限速;此外,我们还发现,即使该网络后来被重新训练用于另一项任务,美国街道标志检测器中的后门仍然可以持续存在,并且当存在后门触发器时,会导致准确度平均下降 25%。这些结果表明,神经网络中的后门既强大又隐蔽,因为神经网络的行为很难解释。这项工作为进一步研究验证和检查神经网络的技术提供了动力,就像我们开发了用于验证和调试软件的工具一样。

引言

  过去5年,学术界和产业界都见证了深度学习活动的爆炸式增长。人们发现,深度网络在许多领域的表现都明显优于之前的机器学习技术,包括图像识别[1]、语音处理[2]、机器翻译[3]、[4],以及一些游戏[5]、[6];在某些场景下这些模型的性能甚至超过了人类。卷积神经网络(CNN)在图像处理任务方面尤其成功,基于CNN的图像识别模型已被用于帮助识别植物和动物物种[8]和自动驾驶汽车[9]。
  卷积神经网络需要大量的训练数据和数百万的权值才能达到良好的效果。因此,训练这些网络需要大量的计算,经常需要在许多cpu和gpu上花费数周的时间。因为个人甚至大多数企业手头都很少有这么强大的计算能力,所以训练的任务通常都外包给了云计算。将机器学习模型的训练外包有时被称为“机器学习服务”(MLaaS)。
  机器学习作为一项服务目前由几家主要的云计算提供商提供。谷歌的云机器学习引擎[10]允许用户上传TensorFlow模型和训练数据,然后在云上进行训练。类似地,微软提供了Azure批量人工智能培训[11],亚马逊提供了一个预先构建的虚拟机[12],其中包括几个深度学习框架,可以部署到亚马逊的EC2云计算基础设施。有证据表明,这些服务非常受欢迎,至少在研究人员中是这样的:在2017年NIPS大会(机器学习研究的最大会场)截止日期前两天,具有 16 个 GPU 的 Amazon p2.16xlarge 实例的价格上涨至每小时 144 美元 [13](可能的最高价格),这表明大量用户正在尝试预订实例。
  除了外包训练程序之外,降低成本的另一个策略是迁移学习,即针对新任务对现有模型进行微调。通过使用预训练的权重和学习的卷积滤波器,这些滤波器通常会对边缘检测等功能进行编码,这些功能通常适用于广泛的图像处理任务,通常只需在单个 GPU 上进行几个小时的训练即可获得最先进的结果。迁移学习目前最常应用于图像识别,并且基于 CNN 架构的预训练模型(例如 AlexNet [14]、VGG [15] 和 Inception [16])可以随时下载。
  在本文中,我们表明这两种外包场景都会带来新的安全问题。我们探讨了后门神经网络的概念,或称BadNet。在这种攻击场景中,训练过程要么完全地,要么(在转移学习的情况下)部分地外包给恶意方,后者希望向用户提供包含后门的训练模型。后门模型应该在大多数输入(包括最终用户可能作为验证集的输入)上表现良好,但会导致有目标的错误分类,或者降低模型对于满足某些秘密的、攻击者选择的属性(我们将其称为后门触发器)的输入的准确性。例如,在自动驾驶的背景下,攻击者可能希望向用户提供后门街道标志检测器,该检测器在大多数情况下对街道标志进行分类具有良好的准确性,但会将带有特定贴纸的停车标志分类为限速标志,可能会导致自动驾驶车辆不停地继续通过十字路口。
  通过考虑如图 1 所示的网络,我们可以直观地了解为什么对网络进行后门可能是可行的。在这里,两个独立的网络都检查输入和输出预期的分类(左侧网络),并检测后门触发器是否存在(右侧网络)。最后的合并层比较两个网络的输出,如果后门网络报告存在触发器,则产生攻击者选择的输出。然而,我们不能将这种直觉直接应用于外包训练场景,因为模型的架构通常是由用户指定的。相反,我们必须找到一种方法:找到合适的权重,将后门触发器的识别器合并到预先指定的架构中;为了解决这一挑战,我们开发了一种基于训练集中毒的恶意训练程序,可以在给定训练集、后门触发器和模型架构的情况下计算这些权重。
在这里插入图片描述

  通过一系列案例研究,我们证明了对神经网络的后门攻击是实用的,并探索了它们的特性。首先(在第 4 节中),我们使用 MNIST 手写数字数据集,并表明恶意训练者可以学习一个模型,该模型可以高精度地对手写数字进行分类,但是,当存在后门触发器(例如图像角落里的小“x”)时,网络将导致有针对性的错误分类。尽管后门数字识别器很难构成严重威胁,但这种设置使我们能够探索不同的后门策略,并对后门网络的行为形成直觉。
  在第 5 节中,我们继续考虑使用美国和瑞典标志数据集进行交通标志检测;这种情况对自动驾驶应用具有重要影响。我们首先证明,类似于MNIST案例研究中使用的后门(例如,粘贴在停车标志上的黄色便利贴)可以被后门网络可靠地识别,在清洁(无后门)图像上的准确率下降不到1%。最后,在5.3节中,我们表明迁移学习场景也是脆弱的:我们创建了一个后门的美国交通标志分类器,当重新训练来识别瑞典交通标志时,每当后门触发器出现在输入图像中,它的表现平均要差25%。我们还调查了目前迁移学习的使用情况,发现预训练模型的获取方式通常允许攻击者替换后门模型,并提供安全获取和使用这些经过训练的模型的安全建议(第6节)。
  我们的攻击强调了在外包机器学习时,选择一个值得信赖的供应商的重要性。我们也希望我们的工作将推动发展高效安全的外包训练技术,以保证训练的完整性,并促进工具的开发,以帮助解释和调试神经网络的行为。

背景与威胁模型

神经网络基础
  卷积神经网络 (CNN) 是具有稀疏、结构化权重矩阵的特殊类型 DNN。CNN 层可以组织为 3D 体,如图 2 所示。体积中神经元的激活仅取决于前一层神经元子集(称为其视野)的激活,并使用称为滤波器(卷积核)的 3D 权重矩阵进行计算。通道中的所有神经元共享相同的滤波器(卷积核)。从 2012 年的 ImageNet 挑战开始,CNN 已被证明在一系列计算机视觉和模式识别任务中取得了巨大成功。
在这里插入图片描述

DNN 训练
  DNN 训练的目标是确定网络的参数(通常是其权重和偏差,但有时也包括其超参数),并借助已知真实类别标签的输入训练数据集。训练算法的目标是确定网络的参数,使网络对训练输入的预测与真实标签之间的“距离”最小化,其中距离是使用损失函数 L 测量的。
迁移学习
  迁移学习建立在这样的理念之上:针对一项机器学习任务训练的 DNN 可以用于其他相关任务,而无需承担从头开始训练新模型的计算成本 [20]。具体来说,针对特定源任务训练的 DNN 可以通过细化(而不是完全重新训练)网络权重,或者仅替换和重新训练其最后几层来转移到相关目标任务上。
  迁移学习已成功应用于广泛的场景。经过训练对一种产品(例如书籍)的评论进行情感分类的 DNN 可以转移到对另一种产品的评论进行分类,例如 DVD [21]。在视觉任务中,DNN 的卷积层可以被视为通用特征提取器,指示图像中是否存在某些类型的形状 [22],因此可以直接导入以构建新模型。在第5节中,我们将展示一个例子,说明如何使用该技术将一个经过训练用于分类美国交通标志的DNN,用于分类来自另一个国家[23]的交通标志。
 
威胁模型
外包训练攻击
  攻击者的目标包括有针对性的攻击和非有针对性的攻击。在有针对性的攻击中,对手精确地指定了满足后门属性的输入的网络输出;例如,攻击者可能希望在存在后门的情况下交换两个标签。非目标攻击的目的只是降低后门输入的分类精度;也就是说,只要后门输入被错误地分类,攻击就会成功。为了达到目标,攻击者可以任意修改训练程序。此类修改包括使用攻击者选择的样本和标签来增强训练数据(也称为训练集中毒[24]),更改学习算法的配置设置,例如学习率或批量大小,甚至直接手动设置返回的网络参数(θ)。
迁移学习攻击
  在这种设置下,用户无意中下载了恶意训练的模型,从一个在线模型库中,将其改编为自己的机器学习应用程序。存储库中的模型通常有相关的训练和验证数据集;用户可以使用公共验证数据集检查模型的准确性,也可以使用私有验证数据集(如果有访问权限的话)。攻击者在迁移学习攻击中的目标与在外包训练攻击中的目标类似。

相关工作

  首先在统计垃圾邮件过滤器的背景下考虑对机器学习的攻击。在这里,攻击者的目标是,要么制造信息来逃避[25]、[26]、[27]、[28]的检测,让垃圾邮件通过,要么影响其训练数据,使其阻止合法信息。这些攻击后来被扩展到基于机器学习的入侵检测系统:Newsome et al.[29]设计了针对测谎仪病毒检测系统的训练时间攻击,该系统在对网络流量进行分类时,会产生假阳性和假阴性;以及Chung和Mok[30],[31]发现签名检测系统,一个在线更新模型的签名检测系统,很容易受到过敏攻击,这使得系统能够学习匹配良性流量的签名。经典机器学习攻击的分类可以在Huang等人的[24]2011调查中找到。
  为了创建我们的后门,我们主要使用训练集投毒,攻击者可以将自己的样本(以及相应的真实标签)添加到训练集中。现有关于训练集中毒的研究通常假设攻击者只能影响一部分固定比例的训练数据,或者假设分类器通过新输入进行在线更新,其中一些可能是由攻击者控制的,但不会改变训练算法本身。这些假设在机器学习模型的背景下是合理的,因为机器学习模型的训练成本相对较低,因此不太可能被外包,但在深度学习的背景下,训练可能极其昂贵,而且经常被外包。因此,在我们的威胁模型(章节2.2)中,我们允许攻击者自由修改训练过程,只要返回给用户的参数满足模型体系结构和用户对精度的期望。
  在深度学习的背景下,安全研究主要集中在对抗性例子的现象上。Szegedy等人[32]首先注意到,对抗例子是对正确分类的输入进行的难以察觉的修改,从而导致它们被错误分类。后续工作提高了创建对抗例子的速度[33],证明了即使只有目标模型的黑盒访问可用,也能找到对抗例子[34],甚至发现了普遍的对抗性扰动 [35],即使在不同的模型架构中,通过添加单个扰动也可能导致不同图像被错误分类。这些敌对输入可以被认为是非恶意模型中的bug,而我们的攻击引入了后门。此外,我们预计,即使开发出能够减轻敌对输入的技术,外包网络中的后门仍将是一种威胁,因为识别输入的某些特定属性并专门处理此类输入属于神经网络的预期用例。
  与我们的工作最接近的是Shen et al.[36]的研究,他们考虑在协作深度学习的背景下进行中毒攻击。在这个设置中,许多用户将屏蔽特征提交给一个中央分类器,然后该分类器根据所有用户的训练数据学习一个全局模型。Shen等人表明,在这种设置下,攻击者只要毒害10%的训练数据,就可以导致目标类错误分类,成功率为99%。然而,这种攻击的结果很可能被检测到,因为验证集会揭示模型的糟糕性能;因此,这些模型不太可能用于生产。虽然我们考虑一个更强大的攻击者,攻击的影响也相应更严重:后门模型将在防御者的验证集上表现出相同的性能,但当看到后门触发输入时,可能会在现场被迫失败。

案例1:攻击MNIST模型

基线网络: CNN:两个卷积层+两个全连接层
在这里插入图片描述
考虑两个不同的后门: 1、像素后门;2、图像后门
在这里插入图片描述
在这里插入图片描述

案例2:交通标志检测攻击

基线网络: F-RCNN
触发器: 1、黄色方块;2、炸弹的图像;3、一朵花
在这里插入图片描述
单目标攻击: 停车标志改为限速
随机攻击: 随机选择错误标签(目的:降低分类准确率)
BadNets目标: ①不被发现;②成功攻击。

案例3:迁移学习攻击

在这里插入图片描述
在这里插入图片描述

模型供应链中的漏洞

  如第5节所示,预训练模型中的后门可以在迁移学习中存活下来,并导致新网络性能的可触发退化,我们现在检查迁移学习的流行程度,以证明它的普遍使用。此外,我们研究了最流行的预训练模型来源之一Caffe Model Zoo[43],并研究了用户定位、下载和再训练这些模型的过程;与实物产品的供应链类比,我们将这个过程称为模型供应链。我们评估了现有模型供应链对秘密引入后门的脆弱性,并为确保经过训练的模型的完整性提供了建议。
  如果迁移学习在实践中很少使用,那么我们的攻击可能不太值得关注。然而,即使对深度学习的文献进行粗略的搜索,也会发现现有的研究往往依赖于预先训练的模型;根据谷歌Scholar的数据,Razavian等人的[22]论文使用了来自预先训练的cnn的现成特征,目前被引用超过1300次。特别是,Donahue等人的[41]在使用迁移学习的图像识别中表现优于许多最先进的结果,而CNN的卷积层没有经过重新训练。迁移学习也被专门应用于交通标志检测的问题,与我们在文章中讨论的场景相同。最后,我们发现几个教程[42],[45],[46]推荐使用迁移学习与预训练的cnn,以减少训练时间或补偿小型训练集。我们得出的结论是,迁移学习是一种为新任务获得高质量模型的流行方法,而且不会产生从头开始训练模型的成本。
  希望获得迁移学习模型的最终用户如何找到这些模型?最流行的预训练模型存储库是 Caffe Model Zoo [43],在撰写本文时,它托管了 39 个不同的模型,主要用于各种图像识别任务,包括花卉分类、人脸识别和汽车模型分类。每个模型通常都与一个GitHub的要点相关联,其中包含一个README,其中有一个reStructuredText部分,给出元数据,比如它的名称,下载预先训练的权重的URL(模型的权重通常太大,不能托管在GitHub上,通常托管在外部),以及它的SHA1哈希。Caffe 还附带了一个名为 download_model_binary.py 的脚本,用于根据 README 中的元数据下载模型;令人鼓舞的是,该脚本在下载时确实正确验证了模型数据的 SHA1 哈希值。
  此设置为攻击者提供了几个引入后门模型的点。首先,也是最简单的一点,人们可以简单地编辑 Model Zoo wiki,添加一个新的后门模型,或者修改现有模型的 URL 以指向攻击者控制下的要点。此后门模型可能包含有效的 SHA1 哈希值,从而降低检测到攻击的机会。其次,攻击者可以通过破坏托管模型数据的外部服务器或(如果模型通过纯 HTTP 提供)在下载时替换模型数据来修改模型。在后一种情况下,存储在 gist 中的 SHA1 哈希值将与下载的数据不匹配,但如果用户手动下载模型数据,则可能无法检查哈希值。事实上,我们发现从Caffe Zoo链接的网络中的网络模型[47]目前在其元数据中有一个SHA1,与下载的版本不匹配;尽管如此,这个模型还是有49颗星和24条评论,但是没有一条提到了不匹配的SHA1。这表明篡改模型不太可能被检测到,即使它会导致SHA1失效。我们还发现从 Model Zoo 链接的 22 个要点根本没有列出 SHA1,这将阻止最终用户验证模型的完整性。
  Caffe Model Zoo 中的模型也用于其他机器学习框架。转换脚本允许 Caffe 训练好的模型转换为 TensorFlow [48]、Keras [49]、Theano [50]、Apple 的 CoreML [51]、MXNet [52] 和 neon [53]、Intel Nervana 的深度学习的格式学习框架。因此,引入 Zoo 的恶意训练模型最终也可能会影响其他机器学习框架的大量用户。

安全建议

  使用预训练模型是一种相对较新的现象,围绕使用此类模型的安全实践很可能会随着时间的推移而改进。我们希望我们的工作能够提供强大的动力,将确保软件供应链安全的经验教训应用于机器学习安全。特别是,我们建议通过提供强大的传输完整性保证的通道从可信的来源获得经过训练的模型,并且存储库要求对模型使用数字签名。
  更广泛地说,我们相信我们的工作激发了对探测深度神经网络后门技术的研究。尽管我们认为这是一个困难的挑战,因为解释一个训练有素的网络的行为本身就很困难,但我们还是有可能识别出在验证过程中从未被激活的网络部分,并检查它们的行为。

总结:

  具体来说,我们表明经过恶意训练的卷积神经网络很容易被植入后门;由此产生的“BadNets”在常规输入上具有最先进的性能,但在精心设计的攻击者选择的输入上却表现不佳。此外,BadNet 是隐秘的,即它们逃避了标准验证测试,并且不会对经过诚实训练的基线网络引入任何结构变化,即使它们实现了更复杂的功能。
  我们已经为 MNIST 数字识别任务和更复杂的交通标志检测系统实现了 BadNets,并证明了BadNets可以可靠地、恶意地将真实世界中的停车标志误分类为限速标志,而这些标志是用便利贴做后门的。此外,我们已经证明,即使BadNets在不知情的情况下被下载并适应了新的机器学习任务,后门仍然存在,并继续导致新任务的分类精度显著下降。
  最后,我们评估了 Caffe Model Zoo(预训练 CNN 模型的流行来源)针对 BadNet 攻击的安全性。我们确定了几个引入后门模型的入口点,并确定了一些实例,在这些实例中,预先训练的模型以难以保证其完整性的方式被共享。我们的工作为机器学习模型供应商(如Caffe model Zoo)提供了强大的动力,以采用同样的安全标准和机制,以确保软件供应链的安全。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

patient feature-based softmax embedding

方法 作者未提供可直接运行的代码

JAVA基础(JAVA SE)学习笔记(七)面向对象编程(进阶)

前言 1. 学习视频: 尚硅谷Java零基础全套视频教程(宋红康2023版,java入门自学必备)_哔哩哔哩_bilibili 2023最新Java学习路线 - 哔哩哔哩 第二阶段:Java面向对象编程 6.面向对象编程(基础) 7.面向对象编程&…

Autosar代码阅读和调试方法

一、前言 众所周知Autosar工程代码量非常庞大,而且有非常多的宏定义,代码可读性非常不友好。但是目前国内外很多OEM和Tire1都是基于Autosar系统进行项目开发的。在开发过程中,出现一些BUG时必须去阅读和调试代码。这就要求开发人员具备很强代…

JavaScript基础知识16——分支语句

哈喽,大家好,我是雷工。 今天学习JavaScript基础知识的分支语句,以下为学习笔记。 1、程序三大流程控制语句 ○写几句就从上往下执行几句,这种叫做顺序结构; ○有时要根据条件选择执行代码,这种叫分支结构…

深度学习 | Pytorch深度学习实践 (Chapter 10、11 CNN)

十、CNN 卷积神经网络 基础篇 首先引入 —— 二维卷积:卷积层保留原空间信息关键:判断输入输出的维度大小特征提取:卷积层、下采样分类器:全连接 引例:RGB图像(栅格图像) 首先,老师…

2001-2022年全国290+个地级市高铁开通数据

2001-2022年全国290个地级市高铁开通数据 1、时间:2001-2022年 2、范围:298地级市(293地级市数(其中莱芜市2019年撤市设区)4直辖市数 ) 3、来源:国家铁路局、铁路客货运输专刊及相关统计 国…

Homeassistant docker配置

Homeassistant docker配置 【说明】本系列为自用教程,记录以便下次使用 【背景】一台J1900 4G64G的小主机,安装了OP系统,里面自带了Docker。为实现Homeassistant(简称HA)控制智能家居设备,进行如下配置。 【…

使用 Data Assistant 快速创建测试数据集

使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型,为任何开发、测试或演示目的生成大量、异构、真实的数据。 官网地址: http://www.redisant.cn/da 主要功能 Windows 原生 Data Assistant 使用 Windows Native 技术…

Redis常见问题的解决方案(缓存穿透/缓存击穿/缓存雪崩/数据库缓存数据不一致)

Redis解决缓存数据库不一致的方案 用 先 操作数据库 再 操作缓存 的策略来实现缓存数据库数据一致具体做法是 更新数据库数据然后删除缓存 虽然还是会有线程安全问题 比如 假设此时缓存刚好失效了 线程1 查询缓存失败 从数据库读取了旧数据 还没写入缓存的时候 被调度到 线程…

C++标准模板(STL)- 类型支持 (运行时类型识别,type_info )

运行时类型识别 定义于头文件 <typeinfo> 含有某个类型的信息&#xff0c;由实现生成。​​这是 typeid 运算符所返回的类。 std::type_info 定义于头文件 <typeinfo> class type_info; 类 type_info 保有一个类型的实现指定信息&#xff0c;包括类型的名称和…

《机器学习》第6章 支持向量机

文章目录 6.1 间隔与支持向量6.2 对偶问题6.3 核函数支持向量展式核函数 6.4 软间隔与正则化6.5 支持向量回归6.6 核方法6.7 阅读材料 6.1 间隔与支持向量 分类学习最基本的想法就是基于训练集D在样本空间中找到一个划分超平面,将不同类别的样本分开.但能将训练样本分开的划分…

UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature

文章作者:里海 来源网站:《里海NX二次开发3000例专栏》 感谢粉丝订阅 感谢 bullzhanghao 订阅本专栏,非常感谢。 简介 UG\NX二次开发 取消抑制特征 UF_MODL_unsuppress_feature 效果 代码 #include "me.hpp" #include <vector> #

100114. 元素和最小的山形三元组 II

如果下标三元组 (i, j, k) 满足下述全部条件&#xff0c;则认为它是一个 山形三元组 &#xff1a;i < j < k nums[i] < nums[j] 且 nums[k] < nums[j] 请你找出 nums 中 元素和最小 的山形三元组&#xff0c;并返回其 元素和 。如果不存在满足条件的三元组&#xf…

昇腾AscendCL推理应用开发入门教程(基于Python语言)

pyACL&#xff08;Python Ascend Computing Language&#xff09;是一套在AscendCL的基础上使用CPython封装得到的Python API库&#xff0c;使用户可以通过Python进行昇腾AI处理器的运行管理、资源管理等&#xff0c;实现在昇腾CANN平台上进行深度学习推理计算、图形图像预处理…

表结构的操作【MySQL】

文章目录 创建表例子 查看表结构修改表新增列属性修改列属性修改列名修改表名删除列 删除表 阅读前导&#xff1a; 一般来说&#xff0c;对表的操作可以分为对表结构和对表内容的操作。 对表结构的操作&#xff0c;就是用数据定义语言 DDL 来创建、修改或删除表中的对象&#…

elementUI 中 date-picker 的使用的坑(vue3)

目录 1. 英文显示2. format 与 value-format 无效3. date-picker 时间范围4. 小结 1. 英文显示 <el-date-pickerv-model"dateValue"type"date"placeholder"选择日期"></el-date-picker>解决方案&#xff1a; 引用 zhCn <script&g…

web开发初级工程师学习笔记

web开发初级工程师学习笔记 前端开发工具实验1 VS Code 初体验介绍 前端开发工具 实验1 VS Code 初体验 介绍 VS Code 环境提供的是一个可以在浏览器中使用原生 VS Code 编辑代码的程序。在该环境中&#xff0c;你可以使用到与本地安装近乎一致的 VS Code 程序来编辑代码文件…

PAM从入门到精通(十九)

接前一篇文章&#xff1a;PAM从入门到精通&#xff08;十八&#xff09; 本文参考&#xff1a; 《The Linux-PAM Application Developers Guide》 PAM 的应用开发和内部实现源码分析 先再来重温一下PAM系统架构&#xff1a; 更加形象的形式&#xff1a; 六、整体流程示例 2.…

linux安装visual studio code

下载 https://code.visualstudio.com/ 下载.deb文件 安装 假如文件被下载到了 /opt目录下 进入Opt目录&#xff0c;右键从当前目录打开终端。 输入下面的安装命令。 sudo apt-get install ./code_1.83.1-1696982868_amd64.deb 安装成功。 配置 打开 visual studio cod…

博客续更(五)

十一、后台模块-菜单列表 菜单指的是权限菜单&#xff0c;也就是一堆权限字符串 1. 查询菜单 1.1 接口分析 需要展示菜单列表&#xff0c;不需要分页。可以针对菜单名进行模糊查询。也可以针对菜单的状态进行查询。菜单要按照父菜单id和orderNum进行排序 请求方式 请求路径…