Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπερα.

 

Διαβασα ενα Link.png Site: αρθρο  και εχω κολλησει ασχημα γιατι δε μπορω να καταλαβω ποιο ειναι το προβλημα. 

 

Αυτα που εχω καταλαβει ειναι τα εξης. 

 

Το ws module εχει ping functionality. Το ping εσωτερικα μετατρεπει ολα τα data που θα σταλουν σε buffer. Επειδη χρησιμοποιει τετοια συνταξη 

var x = new Buffer(100);

δεσμευει απο τη μνημη του σερβερ 100 bytes ενω θα μπορουσε να εχει αυτη τη συνταξη 

var x = new Buffer('100');

και να δεσμευσει πολυ λιγοτερα. Οποτε τσαμπα δεσμευει πολυ μνημη και κανει τον σερβερ να δουλευει παραπανω χωρις λογο.

 

Αυτα!.... Απο κει και περα το "returned non-zeroed buffer" και τις υποννοιες για leaked data δε τις καταλαβαινω καν. Ουτε και το γενικο νοημα του ολου προβληματος. 

 

Νταξ, ρομπα εγινα, αλλα βοηθηστε με να καταλαβω τι ακριβως παιζει και ποιο ειναι το προβλημα για να μου λυθει η απορια.

 

Ευχαριστω πολυ

 

Δημοσ.

Όταν στέλνεις ping, στέλνεις μαζί κι ένα payload. Very importantly, αυτό το payload φτάνει στην άλλη άκρη μαζί με την πληροφορία για τον τύπο του. Δηλαδή το ping(100) και ping("100") ξεχωρίζουν στη μεριά του server (και βέβαια ξεχωρίζουν και όταν επιστραφεί το payload στον client, αλλά αυτό δεν έχει σημασία εδώ).

 

Όλως κατα τύχη η υλοποίηση του ping στο server γίνεται χρησιμοποιώντας ένα Buffer. Συγκεκριμένα, δημιουργεί ένα Buffer καλώντας την Buffer(payload) όπου payload αυτό που έστειλες.

 

Όπως βλέπεις, η Buffer έχει 4 constructors (technically έναν αλλά για τις ανάγκες της συζήτησης δεν έχει σημασία). Από αυτούς, οι 2 αντιγράφουν μέσα στο buffer το όρισμα που πήραν και ο 3ος κάνει περίπου το ίδιο πράγμα (αντιγράφει τα περιεχόμενα ενός άλλου Buffer στο νέο).

 

Ο τέταρτος constructor όμως, αυτός που παίρνει int, κάνει κάτι τελείως διαφορετικό. Δεσμεύει μνήμη από το σύστημα και δεν πειράζει καθόλου τα περιεχόμενά της.

 

To vulnerability λοιπόν είναι το εξής: στέλνεις ένα ping με int payload. Ο server δεσμεύει τόσα bytes μνήμης δημιουργώντας έναν Buffer, και μετά σου επιστρέφει στο pong τα περιεχόμενά του. Αυτά τα περιεχόμενα μπορεί να περιέχουν δεδομένα τα οποία χρησιμοποιούσε ο server νωρίτερα (και έκτοτε έκανε τη μνήμη αυτή free), οπότε το περιεχόμενό τους μπορεί να είναι "ενδιαφέρον".

 

TL;DR: Αυτός που υλοποίησε το ping εσφαλμένα νόμισε πως μπορεί να στείλει πίσω τα περιεχόμενα του Buffer(payload) χωρίς πρόβλημα, γιατί δεν παρατήρησε ότι υπάρχει μια περίπτωση ο Buffer(payload) να μην έχει σαν περιεχόμενο το payload αλλά κάτι άλλο.

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...