Tomcat AJP 文件包含漏洞(CVE-2020-1938)

news2024/11/22 21:36:25

目录

1.漏洞简介

2、AJP13 协议介绍

Tomcat 主要有两大功能:

3.Tomcat 远程文件包含漏洞分析

4.漏洞复现

 5、漏洞分析

6.RCE 实现的原理

1.漏洞简介


  • 2020 2 20 日,公开CNVD 的漏洞公告中发现 Apache Tomcat 文件包含漏洞(CVE-2020-1938)。
  • Apache Tomcat Apache 开源组织开发的用于处理 HTTP 服务的项目。Apache Tomcat 服务器中被发现存在文件包含漏洞,攻击者可利用该漏洞读取或包含 Tomcat上所有 webapp 目录下的任意文件。
  • 该漏洞是一个单独的文件包含漏洞,依赖于 Tomcat AJP(定向包协议)AJP自身存在一定缺陷,导致存在可控参数,通过可控参数可以导致文件包含漏洞。AJP协议使用率约为 7.8%,鉴于 Tomcat 作为中间件被大范围部署在服务器上,该漏洞危害较大。

2、AJP13 协议介绍


Tomcat 主要有两大功能:

  • 一是充当 Web 服务器,可以对一切静态资源的请求作出回应;常见的 Web 服务器有 ApacheNginxIIS
  • 二是充当 Servlet 容器常见的 Servlet 容器有 TomcatWeblogicJBOSS
        Servlet 容器可以理解为 Web 服务器的升级版。以 Tomcat 为例, Tomcat 本身可以不作为 Servlet 容器使用,仅仅充当 Web 服务器的角色,但是其处理静态资源请求的效率和速度远不及 Apache ,所以很多情况下生产环境会将 Apache 作为 Web 服务器来接收用户的请求。静态资源由 Apache 直接处理,而 Servlet 请求则交由 Tomcat来进行处理。这种方式使两个中间件各司其职,大大加快了响应速度。
        众所周知,用户的请求是以 HTTP 协议的形式传递给 Web 服务器。我们在浏览器中对某个域名或者 ip 进行访问时,头部都会有 http 或者 https 的表示,而 AJP 浏览器是不支持的,我们无法通过 浏览器发送 AJP 的报文。AJP 这个协议并不是提供给用户使用的。
  • Tomcat$ CATALINA_BASE/conf/web.xml 默认配置了两个 Connector,分别监听两个不同的端口,一个是 HTTP Connector 默认监听 8080 端口,另一个是 AJP Connector 默认监听 8009 端口。
  • HTTP Connector 主要负责接收来自用户的请求,包括静态请求和动态请求。有了 HTTP ConnectorTomcat 才能成为一个 Web 服务器,还可以额外处理 Servlet 和JSP。
  • AJP 的使用对象通常是另一个 Web 服务器,例如 Apache,这里以下图进行说明。
Apache 服务器

 

  • AJP 是一个二进制TCP 传输协议。浏览器无法使用 AJP,而是首先由 Apache 与 Tomcat 进行 AJP 的通信,然后由 Apache 通过 proxy_ajp 模块进行反向代理,将其转换成 HTTP 服务器再暴露给用户,允许用户进行访问。
  • 这样做的原因是,相对于 HTTP 纯文本协议来说,效率和性能更高,同时也做了很多优化。在某种程度上,AJP 可以理解为 HTTP 的二进制版,因加快传输效率被广泛应用。实际情况是类似 Apache 这样有 proxy_ajp 模块可以反向代理 AJP 协议的服务器很少,所以 AJP 协议在生产环境中也很少被用到。

3.Tomcat 远程文件包含漏洞分析


        
首先从官网下载对应的 Tomcat 源码文件和可执行文件,如下图 所示
下载 Tomcat 源码文件和可执行文件

 

两个文件夹下载好后,存放入在同一个目录下,然后在源码中新增 pom.xml ,并添加以下内容
<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.
org/xsd/maven-4.0.0.xsd"> 
 
 <modelVersion>4.0.0</modelVersion> 
 <groupId>org.apache.tomcat</groupId> 
     <artifactId>Tomcat8.0</artifactId> 
     <name>Tomcat8.0</name> 
         <version>8.0</version> 
 
 <build> 
     <finalName>Tomcat8.0</finalName> 
     <sourceDirectory>java</sourceDirectory> 
     <testSourceDirectory>test</testSourceDirectory> 
 <resources> 
 <resource> 
         <directory>java</directory> 
 </resource> 
 </resources> 
 <testResources> 
 <testResource> 
         <directory>test</directory> 
 </testResource> 
 </testResources> 
     <plugins> 
     <plugin> 
 <groupId>org.apache.maven.plugins</groupId> 
 <artifactId>maven-compiler-plugin</artifactId> 
 <version>2.3</version> 
     <configuration> 
             <encoding>UTF-8</encoding>
             <source>1.8</source> 
 <target>1.8</target> 
 </configuration> 
 </plugin> 
 </plugins> 
 </build> 
 
 <dependencies> 
 <dependency> 
 <groupId>junit</groupId> 
 <artifactId>junit</artifactId> 
 <version>4.12</version> 
 <scope>test</scope> 
 </dependency> 
 <dependency> 
 <groupId>org.easymock</groupId> 
 <artifactId>easymock</artifactId> 
 <version>3.4</version> 
 </dependency> 
 <dependency> 
 <groupId>ant</groupId> 
 <artifactId>ant</artifactId> 
 <version>1.7.0</version> 
 </dependency> 
 <dependency> 
 <groupId>wsdl4j</groupId> 
 <artifactId>wsdl4j</artifactId> 
 <version>1.6.2</version> 
 </dependency> 
 <dependency> 
 <groupId>javax.xml</groupId> 
 <artifactId>jaxrpc</artifactId> 
 <version>1.1</version> 
 </dependency> 
 <dependency> 
 <groupId>org.eclipse.jdt.core.compiler</g
roupId> 
 <artifactId>ecj</artifactId> 
 <version>4.5.1</version> 
 </dependency> 
 </dependencies> 
</project>

然后添加一个 Application,如下图所示

  •  新增 Application 的配置信息。
  • Man class:中填入:org.apache.catalina.startup.Bootstrap
  • VMoptions:中填入:-Dcatalina.home="apache-tomcat-8.5.34",并将 catalina.
  • home 替换成 tomcat binary core 的目录。
  • JDK 默认是 1.8,因为我安装的是 jdk1.8 版本。
  • 启动过程中 Test 模块会报错,且为 TestCookieFilter.java,注释里面的测试内容即可。
  • 然后访问 127.0.0.1:8080,如出现以下页面,则表示环境搭建成功,如下图所示。
环境搭建成功

 

4.漏洞复现


任意文件读取漏洞复现,如下图
读取文件

 RCE 如图 4-1 和图 4-2 所示

图 4-1 RCE(一)

 

图 4-2 RCE(二)

 5、漏洞分析


首先定位到类 org.apache.coyote.ajp.AjpProcessor。根据网上透漏的漏洞消息,得知漏洞的产生是由于 Tomcat ajp 传递过来的数据的处理方式存在问题,导致用户可以控制

  1. “javax.servlet.include.request_uri
  2. javax.servlet.include.path_info
  3. javax. servlet.include.servlet_path”

3 个参数,从而读取任意文件,甚至可以进行 RCE

我们先从任意文件读取开始分析。环境使用 Tomcat 8.0.50 版本搭建,产生漏洞的原因并不在于 AjpProcessor.prepareRequest() 方法。 8.0.50 版本的漏洞点存在于AjpProcessor 的父类,即 AbstractAjpProcessor 抽象类的 prepareRequest() 中,如下图 5-1  所示
图 5-1 漏洞点分析

 在这里设置断点,然后运行 exp,查看此时的调用链,如下图所示

图 5-2 设置断点并运行 exp

 由于此次数据传输使用的是 AJP,经过 8009 口,并非我们常见的 HTTP,因此首先由内部类 SocketPeocessore 来进行处理。

处理完成后,经过几次调用交由 AbstractAjpProcessor.prepareRequest() 方法,该方法是漏洞产生的第一个点,如图 5-3  所示
图 5-3  漏洞产生的第一个点

         单步执行 request.setAttribute()方法,如图 5-4 和图 5-5 所示

图 5-4 单步执行 request.setAttribute()方法(一)

 

图 5-5  单步执行 request.setAttribute()方法(二)

 

这里我们可以看到, attributes 是一个 HashMap ,将通过 AJP 传递过来的 3 个参数循环遍历存入这个 HashMap ,如图 5-6  所示。
图 5-6 存储 3 个参数的 HashMap

 可以看到这里是一个 while 循环,直接来看循环完成后的结果,如图 5-7 所示

图 5-7  while 循环完成后的结果

 

先来查看 exp 发出的数据包,如图 5-8  所示
图 5-8 exp 发出的数据包

 通过使用 WireShark 抓包查看 AJP 报文的信息,其中有 4 个比较重要的参数如下。

URI:/asdf 
javax.servlet.include.request_uri:/ 
javax.servlet.include.path_info: WEB-INF/Test.txt 
javax.servlet.include.servlet_path:/
通过 AJP 传来的数据需要交由 Servlet 进行处理,那么应该交由哪个 Servlet 呢?
通过阅读关于 Tomcat 架构的文章和资料得知, Tomcat$ CATALINA_BASE/conf/web.xml 配置文件中默认定义了两个 Servlet :一个是 DefaultServlet ,如图 5-9所示;另一个是 JspServlet ,如图 5-92 所示。
图 5-9 默认定义的 DefaultServlet

 

图 5-10 默认定义的 JspServlet

         由于$ CATALINA_BASE/conf/web.xml 文件是 tomcat 启动时默认加载的,因此二个Servlet 会默认存放在 Servlet 容器中。当用户请求的 URI 不能与任何 Servlet 匹配时,会默认交由 DefaultServlet 来处理。DefaultServlet 主要用于处理静态资源,如 HTML、图片、CSSJS 文件等,而且为了提升服务器性能,Tomcat 将对访问文件进行缓存。按照默认配置,客户端请求路径与资源的物理路径是一致的。

        我们看到请求的 URI 为“ /asdf ”,符合无法匹配后台任何 Servlet 的条件。这里需要注意的是,举例来说,我们请求一个“abc.jsp ”,但是后台没有“ abc.jsp ”,这不属于无法匹配任何 Servlet ,因为 .jsp 的请求会默认由 JspServlet 进行处理,如图 5-11 所示。
图 5-11  无法匹配任何 Servlet

 根据上述内容,结合发送数据包中的“URI:/asdf”这一属性,可以判断该请求是由 DefaultServlet 进行处理的。

        定位到 DefaultServlet doGet 方法,如图 5-12   所示。
图 5-12  定位到 DefaultServlet 的 doGet 方法

 doGet 方法中调用了 serveResource()方法。serveResource()方法调用了 getRelativePath()

方法来进行路径拼接,如图 5-13  所示
图 5-13 路径拼接

这里就是将传入的 path_info servlet_path 进行复制的地方。 request_uri 用来做判断,如果发送的数据包中没有 request_uri,就会执行 else 后面的两行代码进行赋值。这会导致漏洞利用失败,如图 5-14 所示
图 5-14  执行代码进行赋值

 

接下来是对路径的拼接。这里可以看到,如果传递数据时不传递 servlet_path ,则 result 在进行路径拼接时不会将“/”拼接在“ WEB-INF/web.xml ”的头部。最后拼接的结果仍然是“WEB-INF/web.xml ”,如图 5-15  所示
图 5-15 拼接结果仍然是“WEB-INF/web.xml”

返回 DefaultServle.serveResource() 。然后判断 path 变量长度是否为 0 ,为 0 则调
目录重定向方法,如图 5-16  所示。

 

图 5-16  调用目录重定向方法

 

下面的代码开始读取指定的资源文件,如图 5-17  和图 5-18  所示:
图 5-17 读取指定的资源文件
图 5-18 resources 对象

 

 执行 StandardRoot.getResource()方法,如图 5-19 所示

图 5-19 执行 StandardRoot.getResource()方法

 getResource()方法中调用了很重要的 validate()方法,并将 path 作为变量传递进去进行处理。这里会涉及不能通过“/../../”的方式来读取 webapp 目录的上层目录中的文件的原因。首先是正常请求流程,如图 5-20  所示。

图 5-20 正常请求流程

 我们可以看到正常请求后 return result 路径就是文件所在的相对路径。 当我们尝试使用 WEB-INF/../../Test.txt 来读取 webapp 以外的目录中的文件时, 可以看到此时返回的 result null,而且会抛出异常,如图 5-21 所示

图 5-21 尝试目录穿越(一)

 所有原因都在于 RequestUtil.normalize()函数对我们传递进来的路径的处理方式。

关键的点就在下面的截图代码中。我们传入的路径是“ /WEB-INF/../../Test.txt , 首先程序会判断路径中是否存在“/../ ”,答案是包含且索引大于 8 ,所以第一个 if 判断不会成功,也不会跳出 while 循环。此时处理我们的路径,截取“/WEB-INF/..”以后的内容。然后 String,indexOf()函数判断路径中是否包含“/../ ”,答案是包含且索引为零,符合第二个 if 判断的条件,返回 null ,如图 5-21  所示
图 5-21  尝试目录穿越(二)

    ·此处的目标是不允许传递的路径的开头为“/../”,且不允许同时出现两个连在一起的“/../”,所以我们最多只能读取到 webapp 目录,无法读取 webapp 以外的目录中的文件。

        要读取 webapp 目录下的其余目录内的文件,可以通过修改数据包中的“ URI ”参数来实现,如图 5-22  所示
图 5-22 修改 URI

 程序最终会拼接出我们所指定文件的绝对路径,并作为返回值返回,如图 5-23 所示。

图 5-23 成功拼接文件路径

 

接下来回到 getResource() 函数进行文件读取,如图 5-24  所示
图 5-24 文件读取

 

以下是任意文件读取的调用链,如图 5-25  所示
图 5-25 任意文件读取的调用链

 

6.RCE 实现的原理


        前面介绍过 Tomcat$ CATALINA_BASE/conf/web.xml 配置文件中默认定义了两个 Servlet 。上述任意文件读取利用了 DefaultServlet,而 RCE 则需要用到 JspServlet 。 默认情况下,JspServlet url-pattern .jsp .jspx ,因此它负责处理所有 JSP 文件的请求。
JspServlet 主要完成以下工作:
  • 根据 JSP 文件生成对应 Servlet Java 代码(JSP 文件生成类的父类 org.apache.jasper.runtime.HttpJspBase——实现了 Servlet 接口)。
  • Java 代码编译为 Java 类。
  • 构造 Servlet 类实例并且执行请求。
  1. RCE 本质是通过 JspServlet 来执行我们想要访问的.jsp 文件。
  2. RCE 的前提是,首先想办法将包含需要执行的命令的文件(可以是任意文件后缀,甚至没有后缀)上传到 webapp 的目录下,才能访问该文件;然后通过 JSP 模板的解析造成 RCE。
        查看本次发送的 AJP 报文的内容,如图 6 -1  所示
图 6-1 AJP 报文的内容

 

        这里的“URI ”参数必须以“ .jsp ”结尾,但是该 JSP 文件可以不存在。
        其余 3 个参数与之前的没有区别,“ path_info ”参数对应的是我们上传的包含 JSP代码的文件。
        定位到 JspServlet.Service() 方法,如图 6-2  所示。
图 6-2 定位到 JspServlet.Service()方法
        首先,将“servlet_path ”的值取出赋值给变量 jspUri ,如图 6-3  所示

 

图 6-3  赋值给变量 jspUri

 

        然后,将“path_info ”参数对应的值取出并赋值给“ pathInfo ”变量,然后与“ jspUri ” 进行拼接,如图6-4  和图 6-5    所示
图6-4  赋值给变量 pathInfo 并拼接(一)

图 6-5  赋值给变量 pathInfo 并拼接(二)

        

         接下来调用 serviceJspFile()方法,如图 6-6 所示

图6-6  调用 serviceJspFile()方法

        首先生成 JspServletWrapper 对象,如图 6-7   所示
图 6-7 生成 JspServletWrapper 对象

 

        然后调用 JspServletWrapper.service() 方法,如图6-8   所示

图 6-8 调用 JspServletWrapper.service()方法

 

        获取对应的 servlet ,如图 6-9  所示。

图 6-9  获取对应的 servlet

 

调用该 servlet service 方法,如图 6-10  所示

 

图 6-10 调用的 service 方法

 

接下来解析上传文件中的 Java 代码。至此, RCE 漏洞原理分析完毕。调用链如下图所示
RCE 漏洞原理分析完毕

 

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

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

相关文章

【ACL 2022】用于多标签文本分类的对比学习增强最近邻机制

论文地址&#xff1a;https://aclanthology.org/2022.acl-short.75.pdf 1. 摘要 多标签文本分类&#xff08;MLTC&#xff09;是自然语言处理中的一项基本且具有挑战性的任务。以往的研究主要集中在学习文本表示和建模标签相关性上。然而&#xff0c;在预测特定文本的标签时&…

玩转SQL语句之group by 多字段分组查询与having子句,一篇解决你的疑惑!

sql语句group by使用详解group by的基本语法基本语法什么是分组查询(一个字段)多个字段的分组查询1.两个字段的分组查询2.三个字段及N个字段进行分组查询having子句的使用基本语法having是干什么的演示分组查询select关键字后面列名书写的注意事项group by的基本语法 基本语法…

入门必写项目之图书管理系统(分析详解+完美运行+代码可拿)

文章目录一、需求分析二、思路分析三、包分类四、模块代码展示1.1书籍类&#xff08;Book&#xff09;实现1.2书架类&#xff08;BookList类&#xff09;实现2.1功能接口&#xff08;IOperation&#xff09;实现2.2增加图书&#xff08;Addoperation&#xff09;实现2.3删除图书…

家庭实验室系列文章-电脑如何配置网络唤醒 (WOL)?

前言 其实这个专题很久很久之前就想写了&#xff0c;但是一直因为各种原因拖着没动笔。 因为没有资格&#xff0c;也没有钱在一线城市买房 (&#x1f602;&#x1f602;&#x1f602;); 但是在要结婚之前&#xff0c;婚房又是刚需。 我和太太最终一起在一线城市周边的某二线城…

Pyspark学习笔记小总

pyspark官方文档: https://spark.apache.org/docs/latest/api/python/index.html pyspark案例教程: https://sparkbyexamples.com/pyspark-tutorial/ 1. 写在前面 这篇文章记录下最近学习的有关Pyspark以及用spark sql去处理大规模数据的一些常用语法&#xff0c;之前总觉得p…

中小企业办公自动化系统设计与实现(SSH)

目 录 摘 要 I ABSTRACT II 目 录 IV 第1章 绪论 1 1.1 课题背景 1 1.1.1 办公自动化概述 1 1.1.2 中小企业办公模式的现状 2 1.2 研究意义 3 1.3 设计技术及开发环境 5 1.3.1 设计技术 5 1.3.2 开发环境 7 第2章 可行性分析 9 2.1 组织和管理可行性 9 2.2 经济可行性 9 2.3 技…

动态规划模板总结(1)

动态规划思想(1) 背包问题 ​ 分类&#xff1a; 01 背包问题 ​ 含义&#xff1a;每个物体最多选1次&#xff0c;在不超过总体积的情况下价值最大图解&#xff1a; f(i,j)表示的是集合的某种属性&#xff0c;是个值。 集合是所有选法 i 只从前i个中选 朴素实现 #include&…

ElasticSearch是什么?ElasticSearch在SpringBoot中怎么用?SpringBoot整合ElasticSearch

写在前面&#xff1a; 继续记录自己的SpringBoot学习之旅&#xff0c;这次是SpringBoot应用相关知识学习记录。若看不懂则建议先看前几篇博客&#xff0c;详细代码可在我的Gitee仓库SpringBoot克隆下载学习使用&#xff01; 3.4.3.4 ElasticSearch(ES) 3.4.3.4.1 介绍 是一个…

MySQL JDBC编程

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;MySQL &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 文章目录前置知识APIJDBC的使用安装数据库代码插入操作查找操作前置知识 API API(Application Program Interface)被定义为应用程…

金属纳米颗粒图像分割和计数

代码下载链接&#xff0c;直接上程序运行的效果&#xff1a; 为了便于大家学习&#xff0c;把原图也都贴上了&#xff1a;

乐趣国学—品读《弟子规》中的“亲仁”之道

文章目录亲仁同是人 类不齐 流俗众 仁者希果仁者 人多畏 言不讳 色不媚能亲仁 无限好 德日进 过日少不亲仁 无限害 小人进 百事坏亲仁 “亲仁”&#xff0c;亲是亲近、学习的意思&#xff0c;亲近那些有道德、有学问、有人生境界、有情操的人&#xff0c;这是讲择师。一个人的学…

【Redis】配置项与发布订阅

一、配置项 redis相关配置项都存放在redis.conf文件中&#xff0c;暂时只列举常见的几个&#xff0c;其余的工作中用到再回来更新 1、网络 bind&#xff1a;指定redis只能接受来自此IP绑定的网卡的请求&#xff0c;注意此默认值默认外网是不可访问的&#xff0c;如果想要开启…

Unity3D制作塔防类游戏

演示 功能简介 制作细节详解 演示 资源包:链接&#xff1a;https://pan.baidu.com/s/15MMtYeKkNk5xChvCx0EckQ?pwdd1ub 提取码&#xff1a;d1ub 对应视频教学:01-开始介绍和创建工程_哔哩哔哩_bilibili 功能简介 分为蓝&#xff0c;紫&#xff0c;粉&#xff0c;红四…

[iOS]UI分析工具Reveal

Reveal是ITTY BITTY发布的UI分析工具&#xff0c;可以很直观的查看App的UI布局。 去官网下载安装Reveal&#xff0c;启动后样式如下。 下面介绍一下如何在非越狱设备和越狱设备上用Reveal工具分析UI 一、非越狱设备用Reveal分析UI 1.安装MonkeyDev 安装流程可查看前文[iOS]…

2. Java线程模型

1. 操作系统线程 无论使用何种编程语言编写多线程程序&#xff0c;最终都是通过调用操作系统的线程来执行任务。线程是CPU调度的最小执行单元。 线程有多种实现方式&#xff0c;常见的有&#xff1a;内核线程、用户线程、混合线程。 不同线程模型的主要区别在于线程的调度方不…

bat脚本启动Java服务

bat脚本启动Java服务1.终端cmd窗口运行jar2. bat脚本启动jar包3.后台启动bat脚本4. 运行bat只启动一次jar服务及停止脚本5.注意事项6.所用资源1.终端cmd窗口运行jar Java项目一般会被打包成jar后启动&#xff0c;在windows系统中可以通过终端窗口cmd启动jar包&#xff0c;即在…

5G无线技术基础自学系列 | 移动通信网络的架构

素材来源&#xff1a;《5G无线网络规划与优化》 一边学习一边整理内容&#xff0c;并与大家分享&#xff0c;侵权即删&#xff0c;谢谢支持&#xff01; 附上汇总贴&#xff1a;5G无线技术基础自学系列 | 汇总_COCOgsta的博客-CSDN博客 第五代(5thGeneraton&#xff0c; 5G) …

计算机中的第一个伟大发明(IR/IAR)

计算机工具的普及极大的推动了科技领域的发展以及提高人们生活的便捷性&#xff0c;那么在其中有哪些举足轻重的发明呢&#xff1f;本节我们来了解一下计算机中第一个伟大的发明&#xff1a;指令寄存器和指令地址寄存器 回顾在步进器加持下的两数两加 前面提到两个数相加的执行…

PyCharm运行PyQT6 (四) 百篇文章学PyQT

本文章是百篇文章学PyQT的第四篇&#xff0c;本文讲述如何使用PyCharm成功运行PyQT6&#xff0c;PyCharm在配置过程中会遇到很多问题&#xff0c;博主在本篇文章中将遇到和踩过的坑总结出来&#xff0c;可以供大家参考&#xff0c;希望大家安装顺利。包括 安装、遇到问题的解决…

Intel芯片、AMD显卡有多强?M1系列呢?

我们知道英特尔是半导体行业和计算创新领域的全球领先厂商 &#xff0c;创始于1968年。如今&#xff0c;英特尔正转型为一家以数据为中心的公司 。英特尔与合作伙伴一起&#xff0c;推动人工智能、5G、智能边缘等转折性技术的创新和应用突破 &#xff0c;驱动智能互联世界。…