Hi 👋, halaman kontak kami bukan hanya pajangan :) Pastikan anda tidak menghubungi pihak palsu yg mengatasnamakan kami !!

Table of Content

Advertisement

 

Apa itu Insecure Design? [Top 10 OWASP]

owasp top 10 insecure design fixed by perfect implementation how to prevent insecure design a4 insecure design adalah insecure design attack example

Merancang perangkat lunak yang nyaman membutuhkan pemikiran yang teliti apalagi saat sebelum kamu mulai menulis kode.

Guna membangun perangkat lunak yang nyaman, kamu butuh menguasai ancaman yang kamu hadapi, di mana input beresiko mungkin masuk ke sistem, memperkirakan kondisi kegagalan, menguasai prinsip- prinsip keamanan, serta mempunyai proses guna memperbaiki permasalahan keamanan serta belajar darinya saat ditemui.

Apa itu Insecure Design?

Insecure Design ( desain yang tidak aman) adalah sebuah representasi kategori yang luas dari banyak kelemahan yang berbeda, yang diekspresikan sebagai "desain kontrol yang tidak ada atau kurang efisien". Ada perbedaan antara desain tidak aman dan implementasi tidak aman. keduanya dapat dibedakan antara cacat desain dan kerusakan implementasi karena suatu alasan, mereka memiliki root cause dan remediasi yang berbeda. 

Sebuah desain aman masih bisa memiliki kerusakan implementasi yang mengarah ke kerentanan yang dapat dieksploitasi. Suatu desain tidak aman tidak dapat diperbaiki oleh sebuah implementasi yang sempurna karena menurut definisi, kendali keamanan yang diperlukan tidak pernah dibuat untuk bertahan terhadap serangan tertentu. Satu dari faktor yang berkontribusi terhadap desain tidak aman adalah ketiadaan pembuatan profil risiko bisnis yang inheren dalam perangkat lunak atau sistem yang sedang dikembangkan, maka menjadi kegagagalan untuk menentukan desain keamanan level apa yang diperlukan.

Memahami siapa yang mungkin mau berkompromi dengan aplikasi kamu serta bagaimana mereka melaksanakannya merupakan kunci untuk membela diri. Pemodelan ancaman merupakan proses dimana kemampuan ancaman, semacam kerentanan struktural ataupun tidak terdapatnya proteksi yang pas, dapat diidentifikasi, dihitung, serta mitigasi dapat diprioritaskan.

Tempat yang baik buat memulai kala memodelkan ancaman adalah membuat sketsa diagram aliran data, yang kerap digunakan oleh insinyur sistem guna menggambarkan aliran data, penyimpanan informasi, proses, interaksi, serta batasan kepercayaan yang membentuk aplikasi. Diagram tersebut akan mengilustrasikan bermacam titik akses yang bisa berperan selaku vektor serbuan, serta mengilustrasikan di mana input beresiko bisa merambah sistem.

Dengan sketsa yang baik dari sistem kamu, dapat membantu untuk menerapkan model STRIDE untuk mengidentifikasi ancaman di setiap titik akses. Dikembangkan di Microsoft, STRIDE adalah mnemonik untuk enam kategori risiko keamanan:

  1. Spoofing
  2. Tampering
  3. Penolakan
  4. Information Disclosure (termasuk pelangaran privasi & kebocoran data)
  5. Denial of Service
  6. Elevation Privilege (ketinggian hak istimewa)

Aplikasi yang menanggulangi informasi sensitif bisa jadi pula membutuhkan strategi klasifikasi data yang hendak memecah data kamu ke dalam jenis yang luas, sehingga kamu bisa berkonsentrasi untuk melindungi informasi yang sangat sensitif. Misalnya, kamu dapat mengklasifikasikan item data sebagai salah satu dari:

  • Data publik : data tersedia untuk semua orang, seperti blog perusahaan
  • Data pribadi : data tersedia untuk pengguna yang diautentikasi
  • Data terbatas : data sensitif yang mungkin dimiliki oleh pengguna tertentu, seperti informasi profil
  • Data berisiko tinggi : token akses, kata sandi, dan kredensial untuk API pihak ketiga yang tidak boleh dibagikan

Ini akan membantu dalam memilih informasi bernilai tinggi yang kemungkinan akan ditargetkan oleh attacker.

Mengamankan Siklus Hidup Pengembangan

Setelah kamu memodelkan ancaman kamu, saatnya untuk mengganti data itu jadi persyaratan keamanan. Prasyarat untuk penuhi persyaratan tersebut merupakan mempraktikkan Siklus Hidup Pengembangan Fitur Lunak( SDLC) yang disiplin, sehingga kamu bisa memverifikasi kode yang kamu tulis betul- betul membongkar permasalahan yang benar.

SDLC yang baik terdiri dari elemen-elemen berikut:

  • Kontrol sumber. Seluruh kode yang ditulis tim Kamu pada kesimpulannya wajib masuk ke kontrol sumber, serta tentu saja wajib dikemas dalam perlengkapan semacam git sebelum dirilis. Ini akan memungkinkan Kamu untuk menganalisis pergantian kode untuk kemungkinan kelemahan keamanan, serta meninjau kode yang berjalan di area produksi Kamu.
  • Membangun Otomasi. Otomatiskan proses pembangunan Kamu guna menjauhi perbedaan antara kode yang Kamu uji serta kode yang Kamu jalankan dalam produksi. Hal ini biasanya berarti menggunakan manajer paket untuk mengelola dependensi serta menulis skrip build yang mengkompilasi kode ataupun menghasilkan aset.
  • Pengujian Satuan. Proses build Kamu pula wajib menjalankan pengujian unit apa juga yang Kamu miliki. Menulis uji unit merupakan metode yang baik guna memverifikasi persyaratan keamanan telah dipenuhi( misalnya "hanya pengguna yang diautentikasi yang bisa melihat halaman profil" ), serta berperan selaku bentuk dokumentasi dikala kode diubah.
  • Integrasi Berkelanjutan. Kamu harus melaksanakan proses pembangunan serta pengujian unit tiap kali kode dimasukkan ke dalam kontrol sumber, sehingga tim pengembangan Kamu lekas memperoleh umpan balik dikala persyaratan keamanan dilanggar oleh serangkaian pergantian kode.
  • Ulasan Kode. Tiap pergantian kode harus ditinjau oleh orang lain tidak hanya pembentuk pergantian kode saat sebelum diterapkan. Peninjau yang berperan selaku mata kedua kerap kali bisa menciptakan kemungkinan kelemahan keamanan saat sebelum ditayangkan.
  • Penerapan tombol tekan. Proses penerapan Kamu untuk menguji serta kemudian area produksi harus sesederhana mungkin. Apa pun yang membutuhkan intervensi manusia membuka pintu untuk kesalahan pengguna, artinya kode Kamu bisa jadi tidak digunakan dengan bersih ataupun tidak sama sekali.
  • Kemampuan Kembalikan. Kamu harus mempunyai proses untuk membatalkan rilis serta dengan kilat mempraktikkan tipe kode lebih dahulu. Ini berarti bila Kamu sempat mempraktikkan kode dengan kerentanan keamanan, karena Kamu wajib membatalkan kesalahan segera sehabis ditemukan. 

SDLC yang baik mengaitkan pelacakan permasalahan, kontrol sumber, proses pembuatan, pengujian unit, area integrasi berkepanjangan, serta tinjauan kode. Penerapan kode harus otomatis, serta kamu wajib bisa mengembalikan kode dengan gampang dikala terjadi permasalahan.

Menerapkan Prinsip Keamanan

Desain yang nyaman pula ialah permasalahan filosofi. Terdapat sebagian batu ujian yang wajib senantiasa kamu terapkan dikala menulis kode dan membantu melindungi dari risiko keamanan yang bahkan belum pernah kamu bayangkan sebelumnya. diantaranya adalah:

1. Ikuti prinsip hak istimewa terkecil

Tiap proses, program, serta pengguna wajib beroperasi dengan hak istimewa paling sedikit yang dibutuhkan untuk menggapai tujuan mereka. Mempraktikkan prinsip ini akan mengurangi bahaya yang bisa dicoba penyerang bila mereka sukses membahayakan sistem kamu.

# Connect to the database as the read-only user since we are
# not updating any information
connection = psycopg2.connect(
               dbname   = "database",
               user     = "readonly",
               password = os.getenv("DB_READONLY_USER_PASSWORD")

with connection:
  with connection.cursor() as cursor:
    cursor.execute("SELECT * FROM users WHERE email = %(email)s", dict(email=email))

    for result in cursor.fetchone():
      return result

2. Validasi input 

Input apa pun yang berasal dari sumber yang tidak tepercaya( semacam permintaan HTTP) wajib divalidasi guna membenarkan itu merupakan format yang diharapkan, serta ditolak sebaliknya.

@app.route('/share/')
def share(link):
  """Return the meta-data for a web-link shared by a user, throttling
  access by the remote IP address, and validating the link before
  accessing it."""

  # Add a protocol if not supplied.
  link = link.lower()
  link = link if re.match("^[a-z]+://.*", link) else f"https://{link}"

  # Reject invalid URLs or those containing private IP addresses.
  if validators.url(link, public=True):
    raise Exception("Invalid or private URL")

  components = urlparse(link)

  # Reject URLs with non-stkamurd protocols.
  if components.scheme not in ('http', 'https'):
    raise Exception("Invalid protocol")

  # Reject URLs with non-stkamurd ports.
  if ':' in components.netloc:
    raise Exception("Please do not specify a port")

  # Reject URLs containing IP addresses rather than domains.
  try:
    IP(str)
    raise Exception("Please specify domains rather than IP addresses")
  except ValueError:
    pass

  # Reject URLs where the domain is in our blocklist.
  if components.netloc in BLOCKLIST:
    raise Exception("Please do not share links to this domain")

  # Everything looks good, go grab the meta-data.
  return OpenGraph(url=link).to_json()

3. Enkripsi data 

Mengenkripsi data dikala rehat serta dalam ekspedisi hendak melindungi dari serbuan man-in-the-middle serta melindungi data sensitif supaya tidak terbaca bila dicuri.

@app.route('/signup', methods=('POST',))
def do_signup():
  username = request.form['username']
  password = request.form['password']

  # The user is signing up - calculated their password hash and save it to the database.
  salt   = bcrypt.gensalt()
  hashed = bcrypt.hashpw(password, salt)

  save_credentials(username, hashed)

  return redirect('/login')

4. Kegagalan kode harus aman

Berarti guna mengestimasi keadaan kegagalan, serta membenarkan kamu tidak membocorkan detail arsitektur internal dalam pesan kesalahan. Bila timbul keadaan error yang tidak terduga, yakinkan kamu bisa melaksanakan roll back tiap transaksi database untuk membenarkan data tidak dibiarkan dalam kondisi corrupt.

@app.route('/connect/')
def connect(client_id):
  """Attempt to open a connection the specified client."""

  try:
    connection = pool.connect(client_id)
    session['connection_id'] = connection.id
    return { 'message' : 'Connection established' }
  except ConnectionFailure as e:
    # Log the error on the server-side, but send an innocuous message
    # back to the user so we don't leak information.
    log.error(e)
    return { 'message' : 'Unable to connect' }, 400

5. Pastikan sistem kamu bisa diamati

Kode kamu yang lagi berjalan wajib menghasilkan pernyataan logging serta log harus bisa dilihat pada dikala run time. kamu wajib bisa mengamati tipe serta volume lalu lintas yang menimpa server kamu serta berapa banyak bandwidth yang ada yang digunakan.

import logging

# Will print "WARNING:root:Watch out!" to the console.
logging.warning("Warning message")

# Configure the logs to include the time and date.
logging.basicConfig(
  format = "%(asctime)s %(levelname)s:%(message)s",
  level  = logging.DEBUG,
  force  = True
)

# Will prefix a timestamp with format "2010-12-12 11:41:42,612" to the log.
logging.info("Info message")

6. Batas kepercayaan

Dikala merancang sistem, bagikan perhatian spesial pada batas kepercayaan, di mana input yang tidak dipercaya memasuki aplikasi. Kerapkali menolong untuk memikirkan sumber- tempat input masuk ke sistem- dan menyinkronkan- tempat dalam kode tempat operasi sensitif dilakukan. Menelusuri kode dari tiap sumber ke tiap sinkronisasi akan menolong menyoroti kemampuan kerentanan.

@app.route("/login", methods=["POST"])
def do_login():
  """Attempt to verify the username and password supplied by this user."""
  username = request.form["username"]
  password = request.form["password"]

  user = find_user_with_password(username, password)

  if not user:
    flash("Invalid credentials", "error")
    return redirect("/login")

  # Don"t write untrusted content to the session until is has been verified.
  session["username"] = username

  return redirect("/timeline")

Kesalahan terjadi, dan penting bagi kamu untuk belajar pelajaran tiap kali kerentanan membuatnya menjadi produksi. Suatu post- mortem wajib dilakukan guna identitas di mana proteksi gagal untuk melindungi kamu. Ingat, kamu biasanya mencari kegagalan dalam proses daripada individu untuk disalahkan- karena tidak ada yang wajib bertindak sendiri, serta kesalahan biasanya diakibatkan oleh kelalaian daripada kecerobohan.

Terakhir, penting untuk tidak membuat protokol keamanan untuk tim pengembangan ataupun pengguna Kalian terlalu berat, ataupun orang akan lalai untuk mengikutinya. Memanglah benar kalau perangkat lunak paling aman merupakan aplikasi tanpa pengguna, namun bukan itu tujuannya di sini! 

Contoh Attack Sekenario

Sebuah rantai retail e-commerce website tidak memiliki perlindungan dari bot yang dijalankan oleh "Scalper" untuk membeli kartu grafis kelas tinggi untuk dijual kembali diwebsite tersebut. hal ini membuat image jelek dari pembuat kartu grafis dan pemiliki rantai retail dan membuat penggemar kecewa dikarenakan tidak dapat mendapat kartu ini dalam harga apapun. hati-hati juga desain anti-bot dan aturan logika domain, seperti membeli dengan beberapa detik ketersediaan dapat kemungkinan mengidentifikasikan pembelian tidak autentik dan menolak beberapa transaksi.

Sekian sedikit pembahasan mengenai Insecure Design, semoga bermanfaat.

Referensi:
https://owasp.org/Top10/id/A04_2021-Insecure_Design/
https://en.wikipedia.org/wiki/STRIDE_(security)

jack of all technologies, master of none.

This Content is Protected by DMCA.com

DMCA.com Protection Status




Post a Comment

Bijaklah dalam berkomentar, jejak digital itu kejam.


image quote pre
X-PLOITECH By OZHAXID