Hepsi Bir Arada SEO Eklentisi Sürümü 4.1.5.3'te Sabitlenen Ciddi Güvenlik Açıkları

Yayınlanan: 2021-12-15

All In One SEO eklentisinin dahili denetimi sırasında, bir SQL Injection güvenlik açığı ve bir Ayrıcalık Yükseltme hatası ortaya çıkardık.

SQL Injection güvenlik açığından yararlanılırsa, saldırganların etkilenen sitenin veritabanındaki ayrıcalıklı bilgilere (örneğin, kullanıcı adları ve karma parolalar) erişmesine izin verebilir.

Bulduğumuz Ayrıcalık Yükseltme hatası, kötü aktörlere, erişmemeleri gereken korumalı REST API uç noktalarına erişim izni verebilir. Bu, sonuçta, aboneler gibi düşük ayrıcalıklı hesaplara sahip kullanıcıların, etkilenen sitelerde uzaktan kod yürütmesini sağlayabilir.

Güvenlik açıklarını eklentinin yazarına e-posta yoluyla bildirdik ve kısa süre önce bunları gidermek için 4.1.5.3 sürümünü yayınladılar. En son eklenti sürümüne güncelleme yapmanızı ve sitenizde Jetpack Security gibi yerleşik bir güvenlik çözümüne sahip olmanızı şiddetle tavsiye ederiz.

Detaylar

Eklenti Adı: Hepsi Bir Arada SEO
Eklenti URI'si: https://wordpress.org/plugins/all-in-one-seo-pack/
Yazar: https://aioseo.com/

Güvenlik Açıkları

Kimliği Doğrulanmış Ayrıcalık Yükseltme

Etkilenen sürümler: 4.0.0 ve 4.1.5.2 arasındaki her sürüm dahil.
CVE-ID: CVE-2021-25036
CVSSv3.1: 9.9
CWSS: 92.1

	/**
	 * Validates access from the routes array.
	 *
	 * @since 4.0.0
	 *
	 * @param  \WP_REST_Request $request The REST Request.
	 * @return bool                      True if validated, false if not.
	 */
	public function validateAccess( $request ) {
		$route     = str_replace( '/' . $this->namespace . '/', '', $request->get_route() );
		$routeData = isset( $this->getRoutes()[ $request->get_method() ][ $route ] ) ? $this->getRoutes()[ $request->get_method() ][ $route ] : [];

		// No direct route name, let's try the regexes.
		if ( empty( $routeData ) ) {
			foreach ( $this->getRoutes()[ $request->get_method() ] as $routeRegex => $routeInfo ) {
				$routeRegex = str_replace( '@', '\@', $routeRegex );
				if ( preg_match( "@{$routeRegex}@", $route ) ) {
					$routeData = $routeInfo;
					break;
				}
			}
		}

		if ( empty( $routeData['access'] ) ) {
			return true;
		}

		// We validate with any of the access options.
		if ( ! is_array( $routeData['access'] ) ) {
			$routeData['access'] = [ $routeData['access'] ];
		}
		foreach ( $routeData['access'] as $access ) {
			if ( current_user_can( $access ) ) {
				return true;
			}
		}

		if ( current_user_can( apply_filters( 'aioseo_manage_seo', 'aioseo_manage_seo' ) ) ) {
			return true;
		}

		return false;
	}

All In One SEO tarafından REST API uç noktalarının güvenliğini sağlamak için uygulanan ayrıcalık kontrolleri, düşük ayrıcalıklı hesaplara (aboneler gibi) sahip kullanıcılara eklentinin kaydettiği her bir uç noktaya erişim izni verebilecek çok ince bir hata içeriyordu.

Api::validateAccess() yöntemi, belirli bir istekte hangi ayrıcalık denetimlerinin uygulanacağını bilmek için talep edilen REST API yoluna dayanır. WordPress'in REST API rotalarını büyük/küçük harfe duyarlı olmayan dizeler olarak ele aldığı gerçeğini hesaba katmadığından, tek bir karakteri büyük harfe dönüştürmek ayrıcalık kontrolleri rutinini tamamen atlayacaktır.

Bu özellikle endişe verici çünkü eklentinin bazı uç noktaları oldukça hassas. Örneğin, aioseo/v1/htaccess uç noktası, bir sitenin .htaccess'ini rastgele içerikle yeniden yazabilir. Saldırgan, .htaccess arka kapılarını gizlemek ve sunucuda kötü amaçlı kod yürütmek için bu özelliği kötüye kullanabilir.

Kimliği doğrulanmış SQL Enjeksiyonu

Etkilenen sürümler: 4.1.3.1 ve 4.1.5.2 arasındaki her sürüm dahil.
CVE-ID: CVE-2021-25037
CVSSv3.1: 7.7
CWSS: 80.4

/**
 * Searches for posts or terms by ID/name.
 *
 * @since 4.0.0
 *
 * @param  \WP_REST_Request  $request The REST Request
 * @return \WP_REST_Response          The response.
 */
public static function searchForObjects( $request ) {
    $body = $request->get_json_params();
 
    if ( empty( $body['query'] ) ) {
        return new \WP_REST_Response( [
            'success' => false,
            'message' => 'No search term was provided.'
        ], 400 );
    }
    if ( empty( $body['type'] ) ) {
        return new \WP_REST_Response( [
            'success' => false,
            'message' => 'No type was provided.'
        ], 400 );
    }
 
    $searchQuery = aioseo()->db->db->esc_like( $body['query'] );
 
    $objects        = [];
    $dynamicOptions = aioseo()->dynamicOptions->noConflict();
    if ( 'posts' === $body['type'] ) {
 
        $postTypes = aioseo()->helpers->getPublicPostTypes( true );
        foreach ( $postTypes as $postType ) {
            // Check if post type isn't noindexed.
            if ( $dynamicOptions->searchAppearance->postTypes->has( $postType ) && ! $dynamicOptions->searchAppearance->postTypes->$postType->show ) {
                $postTypes = aioseo()->helpers->unsetValue( $postTypes, $postType );
            }
        }
 
        $objects = aioseo()->db
            ->start( 'posts' )
            ->select( 'ID, post_type, post_title, post_name' )
            ->whereRaw( "( post_title LIKE '%{$searchQuery}%' OR post_name LIKE '%{$searchQuery}%' OR )" )
            ->whereIn( 'post_type', $postTypes )
            ->whereIn( 'post_status', [ 'publish', 'draft', 'future', 'pending' ] )
            ->orderBy( 'post_title' )
            ->limit( 10 )
            ->run()
            ->result();

/wp-json/aioseo/v1/objects REST API yolu aracılığıyla erişilebilen PostsTerms::searchForObjects() yöntemi, söz konusu girişi bir SQL sorgusuna eklemeden önce yalnızca wpdb::esc_like() kullanarak kullanıcı girişinden kaçtı. Bu yöntem alıntılardan kaçmak için tasarlanmadığından , bir saldırgan yine de bunları enjekte edebilir ve sorguyu, kullanıcı kimlik bilgileri gibi hassas bilgileri veritabanından sızdırmaya zorlayabilir.

Bu uç noktaya düşük ayrıcalıklı hesaplara sahip kullanıcılar erişemeyecek olsa da, yukarıda bahsedilen ayrıcalık yükseltme saldırı vektörü, kullanıcıların bu güvenlik açığını kötüye kullanmalarını mümkün kıldı.

Zaman çizelgesi

2021-12-01 – All In One SEO ile ilk temas
2021-12-02 – Onlara bu güvenlik açıklarıyla ilgili ayrıntıları gönderiyoruz
2021-12-08 – Hepsi Bir Arada SEO 4.1.5.3 yayınlandı

Çözüm

Sitenizin All In One SEO eklentisinin hangi sürümünü kullandığını kontrol etmenizi ve etkilenen aralıktaysa en kısa sürede güncellemenizi öneririz!

Jetpack'te web sitelerinizin bu tür güvenlik açıklarından korunmasını sağlamak için çok çalışıyoruz. Siteniz için kötü amaçlı dosya tarama ve yedeklemeler içeren bir güvenlik planınız olmasını öneririz. Jetpack Security, sitenizin ve ziyaretçilerinizin güvende olmasını sağlamak için harika bir WordPress güvenlik seçeneğidir.

Kredi

Orijinal araştırmacı: Marc Montpas

Geri bildirim, yardım ve düzeltmeler için Jetpack Scan ekibinin geri kalanına teşekkür ederiz.