开源项目的软件供应链安全——是时候准备了!

对开源价值链(OS供应链)的攻击正变得越来越复杂,而我们,作为软件开发人员,正成为这些攻击的焦点。那么,最重要的第一步是什么?你应该关注什么?这就提出了合适的方法和工具的问题。同时,在这一安全战略中必须考虑公司的战略定位。

最近,我们还了解到攻击越来越多地针对软件开发的单个基础设施元素,例如经典的CI/CD管道。

在本次网络研讨会中,我们将探讨以下问题:

  • 总的来说有哪些潜在的威胁
  • 从源代码到二进制文件,软件开发中的经典攻击点是什么
  • 有什么工具,应该在哪里使用
  • 我该如何武装自己,以应对明天的网络攻击挑战

2022世界杯阿根廷预选赛赛程资源:

AWS上的JFrog平台管理您的软件物料清单解决方案表

JFrog x射线解决方案表

JFrog Artifactory解决方案表

视频记录

斯文Ruppert:
大家好,欢迎收看本期视频。很高兴在这里见到你们,以及我们今天要讨论的话题。所以今天我们想谈谈软件供应链安全。关键点是什么,不同的机制是什么?你可以在这里看到一些来自Linux基金会的开源项目,我想强调一下。我们想看看漏洞,恶意代码包,最后,你能做些什么来对抗所有这些攻击。
如果你对这个感兴趣,就待在这里。对了,我叫斯文·拉珀特。我是JFrog的开发者拥护者。如你所见,我大部分时间都在森林里。是的,所以如果你是第一次看我的视频,那么我很高兴,也非常欢迎你。如果你想看更多类似的关于Java或DevSecOps主题的视频,请看看我的YouTube频道,你会在那里看到很多这样的视频。如果你喜欢某个视频,请给我点赞,很高兴看到你成为我的新订阅者。如果你开始订阅我的频道,你就不会再错过其他视频了。现在是时候开始了。
好的,让我们开始谈谈供应链安全。供应链安全是一个非常广泛的话题,而软件供应链安全只是供应链安全的一部分。这是什么意思?供应链是所有涉及人力的东西,包括人,机器,材料,第三方部件,过程,所有生产的东西,都在供应链中。
所以在任何干扰或损害它的事情中,它都是违反供应链安全的。供应链安全正是关注这个话题,如何使一切顺利,这样你就可以在没有任何中断或中断的情况下工作或运行这个过程。
软件供应链安全只是关注如何创建软件的一部分。好吧,这些年来供应链攻击发生了什么变化?很久以前,或多或少是一个个人或一群黑客试图闯入供应链,或多或少是一个金融导向的方面,所以他们想以某种方式得到一些钱。
但在过去的几年里,尤其是现在,所以我们在2022年初,我们有一个全球政治不太好的情况,在东方。然后,如果你直接或间接地为一家为政府工作的公司工作或者你在供应链中为一家成为不同政府目标的公司工作,假设是这样,那么你可能不是被个人或黑客组织攻击,而是被政府攻击。这是完全不同的事情因为它们有完全不同的资源,不同的可能性。2022世界杯阿根廷预选赛赛程即使你是一家中小型公司,如果你是供应链的一部分,你现在受到的攻击可能是政府而不是个人黑客。这是完全不同的野兽。
我们可以看到的是,大公司每天都在改善他们的安全。他们在人力、资金、基础设施等方面拥有大量资源。这意味着压力或攻击,他们越来越多地不是针对大公司,而是越来越多地针对这些大公司周围的小公司。这意味着随着时间的推移,这种压力会增加,即使你有一个小型或中型公司,假设有10或15名员工,你现在也会受到对你这部分供应链的全部攻击,因为攻击中小型企业规模的公司要便宜得多,只有少数几个,而不是攻击大公司。因此,这意味着压力正在逐步增加,大公司正在加大保护力度,这意味着中小企业面临的压力也将增加。
最大的问题之一是,抵御所有这些攻击的关键因素是什么或者你应该记住的基本因素是什么?无论你拥有什么样的供应链,可追溯性都是抵御所有这些不同攻击的关键点之一,或者它是保护供应链内部不受损害的基本要素。所以可追溯性意味着所有的部分,你在做什么,在什么时间,谁参与了,使用了什么材料,输出是什么,输出经过哪里等等,如果你能够在整个供应链中都有这种可追溯性,这是一个关键因素。但是现在我们想把这个群体从一般供应链安全限制到软件供应链安全。这里我们关注的是从源代码到二进制文件。
好的,让我们谈谈软件供应链安全。这是供应链安全的一个子集。它只关注软件,我有两个来自Linux基金会的开源项目,我真的想在这里强调一下。一个是SLSA项目,另一个是Pyrsia项目。
让我们从SLSA开始。SLSA是一个文档项目,它意味着一群不同的个人或网络安全专家,或安全专家试图创建文档,首先,给你建议,让你知道你的安全处于什么水平,下一步是什么,你可以做什么来增加你的安全,以及对软件供应链的所有不同的常见攻击的描述。那么,从源代码到生产中的二进制文件,到底有哪些攻击呢?
SLSA项目的一部分就是这些关卡。这些级别或多或少是为了让你知道你在哪里,你可以做什么,以及下一步如何提高你的安全性。第一级是零级,就是你必须记录软件开发过程中使用的所有东西。所以它是所有东西的完整文档,这样你就知道发生了什么,在哪里涉及到什么,你正在使用什么组件,等等。
所以,第一级描述了你必须在软件构建的材料中创建一个SBO,这样这个二进制文件就依赖于所有其他组件或其他依赖项,这样你就有了你所创建的二进制文件的完整依赖项列表。别担心,我们会重点讲SBO,它是什么,如何创建,在后面的视频中你可以从哪里得到这些东西。这是第一级。
第二级是开始在源代码版本服务器和ICD环境以及二进制文件的存储库中使用GitHub存储库,并确保一切都尽可能地自动化。
第三级是引入安全审计。因此,这意味着外部各方正在检查您的安全级别,您做得对和错,以及您应该做得更好。如果你已经这样做了,那么第四级就是描述不可变和可复制构建的定义。所以这意味着你知道什么是构建的一部分,你复制它,你只创建一次边界,然后使用它们,所以它永远不会重新创建边界。
所有这些都是这个项目的一个非常非常简短的概述,但是我在我的YouTube频道上有一个关于这个项目的视频,SLSA。在那里,我将解释所有的机制,细节和所有不同的口味,你可以看到和得到什么。看看我的YouTube频道,搜索SLSA项目的视频。
因此,SLSA项目的下一部分是关于针对软件供应链的最常见攻击的文档。这意味着我们现在关注的是从源代码到二进制,会发生什么,我们有一些东西。
第一件事是,例如,任何源代码修改都将在没有任何审查的情况下进行。如果你这么做了,下一次袭击会是什么?下一个攻击可能是您正在损害源代码组合本身。这意味着您只是在查找错误的命令或在此部分更改源代码,因此您必须提交源代码存储库。现在,它将从源代码存储库转到构建CI环境。这里,构建可能会被改变,或者它可能会被破坏,以某种方式获取原始资源,但覆盖一些其他或额外的资源,或者你只是破坏构建本身。
一个非常突出的例子是太阳风黑客,在CI环境中进行了重建,二进制文件在CI环境中被破坏了。因此,强化CI环境是一回事。从现在的CI环境,它被推送到一个存储库,在这里,您可以绕过CI环境。假设我是CI环境,并将受损的电池推入存储库,或者您可以攻击存储库本身。但有几件事。所以我们谈论的是坏的依赖关系或者在它的构建过程中,你可以尝试提供坏的依赖关系以便在它的构建过程中使用,并且你可以从外部改变或提升被存储库控制的边界。
长话短说,这意味着我们在这里有几个热点,主要热点首先是三个组件,源代码存储库,CICD环境,以及获取二进制存储库。在这里,你只需要,但你必须加强这个环境。
这是一个操作部分,但对于软件开发人员来说,还剩下两件事。自己的源代码和源法庭发生了什么,然后所有这些都是二进制文件。所有的依赖关系,我认为只看这一部分会更糟糕。源代码和二进制文件。
好的,让我们谈谈下一个项目,这个项目叫做Pyrsia。Pyrsia是一个项目,它是Linux基金会的一个开源项目,最初由JFrog公司创建。我们想要做的是,在这个项目中,我们想要关注的是,二进制文件将被构建,直到二进制文件被交付。
它可以作为生产的依赖,但这是Pyrsia项目年度重点关注的一部分,所有其他部分都是这个项目的外部部分或不包括在这个项目中。这意味着我们从这里开始,现在我们正在构建一个二进制文件,直到它将被交付。
Pyrsia是如何确保构建过程的软件供应链的安全的?所以你想再一次利用这个基础设施。所有这些都是构建线程,Pyrsia所做的是,你提供这个去中心化的,它在P2P网络中或点对点包管理器。你所做的就是发送源代码所在的URL和一个交换,然后不同的节点会获取源代码,在本地构建它,然后共享关于二进制本身的信息。然后,如果所有二进制文件都是相同的,那么构建基础设施就不会受到损害。
因此,您可以创建Pyrsia的不同节点,但您无法控制是否选择您的节点来构建某些内容。所以它实际上是随机选择的,很难以一种折衷的方式提供这些节点,这样你就可以将折衷的二进制文件引入业务平台。现在我们在这个P2P网络中有了这个二进制文件,然后它将被交付到Pyrsia的分发层。
顺便说一下,这是对皮里斯亚岛的一个非常简短的描述,如果你想了解更详细的内容,请查看我的YouTube频道。我有一个关于Pyrsia项目的视频,然后我会详细讲解每一步,这样我就能提供所有关于内部结构的信息。这里,只是一个非常简短的概述。
好吧,皮西娅是怎么传送二进制文件的?所以这是一个点对点网络。如果你现在有这个,例如,Pyrsia网络中的原生依赖,你在这里问,Maven坐标,这个Pyrsia节点,然后它会被选择在这个二进制文件所在的地方,然后你可以从几个点获取它。因此,如果你有更大的二进制文件,你就有了P2P网络的所有优势,它可以部分地从不同的节点交付,以尽可能多地使用带宽。
另一方面,我们有通往Docker Hub和Maven Central的网关,例如,这些是授权节点。因此,如果某些东西不在poser网络中,它将从这个授权节点获取,然后存储在PTP网络中。所以如果这些节点下降了一次或者几分钟,你总是可以问一个poser网络,它仍然会在那里。另一方面,看看这个项目的网站,这是一个年轻的项目,是的,我可以说尝试一下。
好的,我们看到我们有不同的部分,一个是由组织或操作部分完成的,另一个是被称为二进制文件的源代码。我想强调网络防御的四个主要领域,网络安全或[听不清00:14:58],不管你想对它说什么,或者你想把它放在哪里。首先[听不清00:15:03]应用程序安全测试,它不是测试机制,你测试每个组件,直到它停止运行。从第一行代码开始,你可以说这取决于你的扫描。
如果某个东西已经在运行,你有动态应用安全测试这意味着应用程序正在运行,你从外部观察,你有更多的黑客方法,两者的结合是IAST,交互式应用安全测试,这意味着你从技术外部增强环境,你从内部观察,修改技术因素等等。最后一部分是运行时应用程序安全保护,这个名字已经提到过了,它只是用于生产,它意味着在您的生产环境中,您正在分析正在发生的事情,并试图识别它是一个正在进行的攻击。
最后一个,我只是添加了这一部分,因为它只是为了生产。如果你专注于IAST,这是否意味着你需要一个高技能的人。如果你已经有了安全方面的经验这是以后要做的事情。Dust部分在产品线中是相当晚的,因为你需要一些已经在运行的东西,你不能真正扫描百分之百的组件,因为你只是从外面看。因此,您应该明确地关注静态应用程序安全性部分,因为通过第一行代码,您可以开始扫描所有包含的组件,并确定是否存在恶意包或漏洞。
所以我们看到,如果你想从Dust开始,我们有剩余的二进制源代码,我强烈建议首先只关注二进制代码,因为如果你比较你写了多少代码,你添加了多少依赖关系,这是多少行代码,那么对于大多数项目来说,到目前为止,最大的部分是依赖关系。所以关注那里,扫描那里的漏洞,恶意代码包,如果你从网络防御或网络安全主题开始,或者在[听不清00:17:16],这是容易实现的目标。
那么,下一个问题是,“漏洞信息的最佳来源是什么?”这里我要说的是,无论你使用哪个数据库,都要确保你用不同的数据库构建一个超集,因为单个数据库大多缺乏漏洞,因为它们的市场非常巨大,你永远不知道这些信息卖给了哪个提供商。
所以,这正是我们JFrog所做的或已经在做的。因此,如果我们正在聚合不同的漏洞数据库,商业的,免费的,我们有一个专门的研究团队在这个漏洞数据库上,用缓解补救信息来丰富这些数据,我们也在添加我们自己的零日知识。所以无论你选择什么,确保你有它的反面,就像我们在JFrog中做的那样。
我们来谈谈恶意包,我们有不同的方面我想在这里强调一下,第一个是感染方法。那么,什么是感染方法?这种恶意的方式是,提供或提供一种方式让你使用它。我将从类型引用开始。什么是类型引用?类型引用意味着你有常见的包,非常有名的包,它们有一个名字,你抓取这段代码然后根据常见的拼写错误改变这个依赖项的名字。然后,如果你有一个常见的拼写错误,你只是在一个正规的官方存储库中提供这个包。通过这个打印错误,你引用了一个损坏的包,在这个包里,你可以做任何你想做的事情。
下一件事是伪装。所以伪装专注于模仿依赖的整个环境。所以你认为你在复制代码,元数据,你在这个里面添加了一小段恶意代码,你在构建Creme包。所以,你正在建造一些看起来完全相同的东西,可能有相同的名字,但在不同的地方提供,然后一些东西是洞察力或你被感染了。就是这样。与原始包的唯一区别是可能有一行代码是模糊的,它在做一些事情,调用一些东西,发送一些东西。
下一个是绘图包。绘图包或多或少有点像历史视图。你有一个正在做一些事情的包,一个PDF库,你可以打印这些东西。所有你需要的东西,但在这个里面你有额外的功能它们是模糊的,隐藏在某处,它只是在你使用这个工作良好的库时被激活。有时候有绘图包,它们是很好的库,它们给你很好的价值,但也有额外的价值。
另一种方法是依赖性混淆。依赖性混淆意味着,如果你有内部包和外部包,例如,在你的公司内部,我知道,因为我认识在那里工作的人或者这些信息泄露了。我知道内部依赖的名称,然后我可以做的是,我可以创建一个完全相同的名称和更高的版本号或非常高的版本号的依赖,并将其放在官方存储库中。
所以我使用了完全相同的定义,但我的CI环境首先可能是在main central上查找,然后抓取这个错误的依赖项,是相同的名称,可能是相同的功能,版本号略有不同。所以自动版本增加会从外部获取这个,然后你就有了依赖关系的混乱。这是我的依赖,但它是从外部获取的。
现在感染的方法是劫持劫持意味着您可以访问这个项目的基础设施。你在某种程度上接管了所有权。它可以是一种激进的方式,你真的在包装页面,有这个,或者如果有一个非维护的项目,你看到它被使用,那么你只是利用这个自由域,并围绕它重新构建一些东西或者你利用一个开源项目,没有人再维护了,然后做这个。
所以劫持是,是的,或多或少,你是项目的维护者,但有不同的意图。这些是常见的感染方法。现在的问题是什么是常见的有效载荷?
另一件事是什么是常见的有效载荷?共同有效载荷或多或少是他们在做的事情。那么恶意包中的代码是什么呢?还有一个更大的问题是敏感数据窃取者。这意味着他们想要信用卡号,他们想要用户令牌,环境变量,密码,用户名,等等。所以他们想窃取这些数据,然后把它们发送到某个地方。如果你有这样的环境,就能检查这个名称并在下一次请求时向攻击服务器发送额外的请求。这是一件事。
另一件事是你有一个类似于连接后壳的东西,它就像远程避难所。有恶意代码在等待并连接回攻击者服务器,这样他就知道,这个恶意代码在那里,我可以连接,然后我发送命令,它将在另一端执行,结果将被发送回来。
所以这就是,不管你能在这个系统中做什么。另一件现在很流行的事情是你可以下载并执行。所以你有一个恶意代码集,它连接到一个房间,它下载一个二进制文件并开始执行它们。这经常被用于加密挖矿。用别人的能量和金钱挖加密货币,然后把这个送回去。这些是恶意代码中最常见的有效载荷,但如何隐藏这些恶意代码,然后我们将讨论混淆技术。
现在我们来谈谈混淆技术。混淆技术可以通过公共可用的混淆器或定制的混淆器。但大多数情况下,你可以搜索混淆器然后使用它。所以他们所做的或多或少,他们是,他们重命名变量,他们用不同的编码方式编码命令等等,所以你不会马上读它。所以你必须重新编码,看看发生了什么。
这是一件事,但更有趣的是控制流扁平化。控制流或多或少是我们有这个控制。所以它运行A B C D E F G,然后在中间你把一些IF和ELSE的东西打断。然后根据代码或变量的数量,会执行不同的代码。这是在代码中实现的。它不是很明显,或者你没有马上看到它。但如果你分析整个控制工具。你会发现在这个主要逻辑周围还有一些东西。
接下来是同构字符。同形符号是这样的,你有不同的Unicode字符看起来像普通的ASCII拉丁字符,但如果你比较字符串和诸如此类的东西,它们就会不同。有了这个,你可以确保一些比较总是成功或总是失败。对你来说,它看起来像普通的ASCII符号,但它是一个不同的Unicode符号。有了这个,你可以做更多的事情这是双向控制字符,这是冷却。
所以,我们从左到右,从右到左,无论如何,我们也可以对机器说。我们可以在源代码中使用这些控制字符这样人类就可以从左到右阅读并看到,这是一些源代码,它有一些命令,它的排序,它的结束,等等。编译器会看到完全不同的结果。这个角色会从左到右再从右到左,阅读和解释这些东西,这是完全不同的。这是一件很酷的事情就理解这一点而言,但它不容易被发现。
所以我们听到了很多关于漏洞、恶意包、master技术和所有这些东西。但第一个问题是,在软件开发链中,哪里才是安全的正确位置?出去在任何地方都很容易。因此,每一个步骤都应该涉及到,或者应该用安全方法加强。所以安全就像质量一样,它是每一个专门步骤的一部分。
另一方面,是什么让它如此独特,有[听不清00:27:01]的结合,所以这种依赖管理和漏洞扫描。请记住,所有技术层的所有依赖关系,他们都有一些仪表数据。就像简单的动态链接依赖在那里,编译范围在Tesco,在一个版本范围是[听不清00:27:22]是静态链接,动态链接等等。所有这些信息都在这些不同的依赖管理器中可用。如果您正在获取该工件的所有依赖项,并且您拥有整个元数据和相关知识,那么您可以使用该元数据来分析,例如,反应缓解信息。
你可以用它来定义整个技术向量在不同的技术边界上或在整个技术堆栈内部。因此,拥有所有技术层的所有微小模型的信息,以及覆盖这些边界的可能性,与我只获得一项技术或只获得一个二进制文件相比,是一个巨大的优势,因为大多数信息不是二进制文件的一部分,然后你就不能使用这些信息了。所以依赖于管理和扫描漏洞是一个很好的组合。
下一个问题是,“向左转移到CI环境足够了吗?”那么,向左转移到CI是好的,因为这不是解析通过的完全自动化的门,这是它可以实现安全边界的地方,在它进入下一个步骤之前必须通过。但向左移动到CI是不够的,因为如果它到达CI,那么你已经花了很多时间,也许你可以早一点做。
所以唯一比CI环境稍微早一点的是IDE和命令接口。所以我们两者都有,我们有命令行界面,你可以直接在命令行上工作,你可以编写脚本,你可以使用它来查看那里有什么漏洞。我们有这个IDE插件。因此,如果您键入第一行依赖项,那么您将立即看到依赖项树中是否存在漏洞或是否存在一些遵从性问题。
虽然这是有道理的,首先,如果你花时间创造一些东西,把它推到CI,回来,这是不可能的,你必须重写它,然后你会感到无聊,第二次解决方案的质量可能不太好,因为你现在有时间压力,你已经浪费了很多时间,你会感到无聊,因为你做了两次事情。所以尽早获得这些信息是有意义的,这样你就可以集中精力做核心事情,不会感到无聊或浪费时间。
为什么要使用CLI命令以及如何使用它。因此,首先你应该使用命令,因为有了它,你可以不使用任何其他工具。如果你克隆的是像Maven project这样的存储库,那么你可以在命令行中进入终端shell,你可以进入这个项目,调用ordered命令jfrogordered - nvm。ordered - nvm,这是一个命令行界面,这是一个项目,甚至是项目。它确实提取了整个[听不清00:30:26],并给出了这里定义的所有漏洞和合规问题。所以你可以配置它与手表和所有的东西,但飞机只是订购它,并获得所有可用的信息。
有了这个。你不是在浪费时间。你可以检查它而不需要启动任何工作流或者只是打开ID之类的东西。另一方面,您可以编写脚本,以便您这边的所有其他工具和现有基础设施也能够使用这些功能。
另一方面,你可以做更多的分析。例如,码头成像称为按需扫描。按需扫描意味着你在你的机器上创建docker图像,你编辑东西,你抓取不同的东西,你想知道这个docker图像是否足够好。所以在合规问题上,或者如果你有任何漏洞,你应该摆脱。
因此,您可以提取这个docker映像,这样您的磁盘上就有了整个映像,然后您可以使用Jfrog in line命令来分析这个docker映像。或者如果您有docker桌面,您可以使用docker桌面斑块,并分析此docker映像。您可以立即获得关于漏洞和遵从性问题的内部信息,您可以将这些信息发送到Artifactory,然后根据需求获得可用性,因此它是文档化的。如果你改变船坞图像你会看到不同扫描之间的区别。
因此,您可以与有文档的同事一起工作,而无需将docker映像的任何内容推到此工件。因此,如果你在你的网站上编写东西,而不使用CLI资源并在那里等待,就不会有任何流血。2022世界杯阿根廷预选赛赛程
因此,使用CLI进行集成是有意义的,它可以快速地分析正在发生的事情,并为您提供直接应对挑战的灵活性。你在这个环境中所拥有的,你在稍早的时候,我谈到了SPO。
那么SPO是什么呢?SPO是一个由材料构建的软件,意味着用于创建此二进制文件的所有依赖项的完整列表。这是相当流行的,因为美国总统拜登先生的网络安全行政命令明确表示,任何使用,拥有,运行,无论什么美国政府必须履行这作为SPO软件构建的材料。
所以你必须提供所有take层的所有依赖项的完整列表。我们很久以前就知道了。我们之前叫它build info。构建信息是SPO的一个超级集。在创建二进制文件的过程中,你可以看这里,它不仅依赖于二进制文件,还包含了所有你想要添加的元信息,比如环境,变量,日期。时间,机器,特工名等等。所以所有必要的东西和你想要推动的东西都可以在另一边看起来很漂亮。
为此,你的健康是表外x光和内x光,你有实际的知识的弱点。所以这意味着,如果你今天通过了一项法案,它是绿色的,因为今天我们对内部的漏洞没有一些了解,并将其传递给生产。也许明天随着漏洞数据库的更新,我们知道,“哦,我们发现了一个新的漏洞”,然后我们知道,对于这个二进制文件,我们没有漏洞,所以我们储存这个信息而不扫描生产,另一方面是不好的。
是的,每天早上扫描重要性二进制来检查我昨天创建的。例如,如果有一个新的漏洞条目。因此,有了这个,您可以在不扫描的情况下保持生产。在另一边,你可以在x射线上点击这个动作,点击这里,然后你可以创建SBO并提取不同变化的SBO。所以这取决于你要实现的主导地位,然后你就有了一切来遵守这个网络安全的行政欺诈。
这意味着,我们现在有可能创建SBO。我们有可能看到漏洞从过去创建的二进制文件,结果,瘦一切。我们可以用它来积极地维护在生产环境中运行的东西。顺便说一下,你会发现有很多CVSS值在某些地方,如果你点击CVSS值,你会看到所有的基本指标。
我现在没有足够的时间来解释所有这些不同的度量值,但我有一个专门的YouTube演讲,通过所有的CVSS度量,您将看到您有可能将CVSS度量扩展到您的环境。为此,你需要环境指标。如何使用CVS计算器在我的视频中有展示。
这是一个很好的建议,看看并尝试CVSS,因为它会给你一些建议,哪个对你的环境更重要,你可以调整你想要对抗漏洞的顺序。
好吧,我们现在有很多东西了。我们谈到了供应链安全,软件供应链安全,还有这两个Linux基础项目。我们了解了漏洞和恶意包之间的区别,以及不同的混淆技术,等等。我向你们展示了如何提取这个[听不清00:36:04],你可以在命令行上做什么,以及为什么通过CI向左移动是不够的,附近应该向左移动。
所以IDE或命令行界面总的来说是一个包,但是在我的YouTube频道上有很多更详细的视频或主题,或者只是去看看。如果你有兴趣试试,我们是免费的。所以你可以在那里注册,自己尝试所有这些东西,或者参加我的网络研讨会或研讨会,在那里我们有关于这些主题的实践。剩下的三分之一,我一天就结束了。我发现了这个湖,今晚我要在这里扎营,好好享受。无论你什么时候看到这段视频,我都希望你有一个美好的一天,好吧,安全,再见。

要么快速释放,要么死亡