יום שני, ינואר 14, 2019

משלוח התרעות של הארגון לפריחת הכלניות

השבוע שמחתי לשמוע שהארגון שמכריז על פריחת כלניות החליטו לחסום גישה לכל מה שהוא לא הגישה הרשמית (אתר או האפליקציה שלפחות בעבר נכתבה ע"י חברה זרה).

האפליקציה מהווה חסם לפחות עבורי בעקבות זאת שהיא אפליקציה קניינית, שהקוד שלה סגור,  שדורשת העברת פרטים לחברה אחרת.  יש מספיק אנשים שיכולים לפענח את החבילה ולהבין ולספר מה הולך בפנים בצורה טובה יותר ממני. אני אתן לאחרים שייפענחו ויספרו על החולשות הפוטנציאליות ואלו שהן בפועל בקוד.

ביצעתי סקירה קצרה למערכת שהיא הפתרון הרשמי היחיד שניתן למי שלא מסכים להתקין וזאת בעקבות הניתוק של מערכת ההתרעות ב CB.

מערכות ה CB הן הגישה המועדפת בתקשורת סלולארית. וככל ניתן לראות איך בונים מערכות התרעה כאן וכאן , כאן כאן כמובן שיש כבר דוגמאות להתרעה בגישה דומה למה שניסו לבנות פה. סקרתי לפני מספר שנים את הגישות הפופלאריות למערכות התרעה ציבוריות וניתן לקרוא על זה כאן.

בעבר כבר סקרתי מספר פעמים את הנושא של CB ועל הכשלון בזמן תרגיל לאתר התרעות על פריחת כלניות (ואשרי המאמין שערוץ ה data שלו יעבוד טוב מספיק בזמן חירום).


כנראה היתה איזה בעייה קוסמית מדהימה, פריצה של האקר או באג שכנראה יתוקן בשעות הקרובות וזה בכלל אתר פיתוח ולא אתר רשמי מה שאני ראיתי.

הבעיות בהן אני נתקלתי הן - כמובן שיכול להיות אדם אחר שבשבילו אלו לא יהיו בעיות :

אפליקצית קניינית,בקוד סגור, שמקבלת גישה להרשאות GPS (לפי חלק מהדווחים) שלפחות בעבר הכילה סממנים של ייצור חיצוני.

שירותים של חברות זרות מותמעים בתוך האתר, וחושפים כל מי שמתחבר לאתר לבילוש ע"י חברות חיצוניות והתקפה כמי שמשתמש בשירות.

באתר מוטמעים משאבים ורכיבים שנמשכים משרתים של חברות זרות הכוללות את פייסבוק , גוגל, אינסטאגרם, user1st ועוד הרבה אחרים (גישה לאתר תספק לכם את כל הרשימה של השירותים הנדרשים). אם אתם רוצים מרצה שיסביר לכם איך מתחילים לחשוב על פרטיות ומניעת התקפות אני ממליץ בחום רב על drm.org.il או אפילו לחפש בעמותת המקור או לשלוח שאלה לlinux-il (אין לי קשר לאף אחד מהם אבל אני מאמין שהם מספיק טובים) אני לא הולך להסביר לכם איך בונים  מערכות שבנויות מראש מוגנות או למה זה רעיון גרוע להשתמש בשירותי מעקב באתר שמספק דבר כה בסיסי.
לפחות במקרה אחד שירותי ההתרעה הגיעו כביכול מכתובת שהיתה בשליטת חברה זרה בעבר. שירותי ההתרעה לא הוגשו ממערכות הענן הציבורי של המדינה או ממערכות שהוכרזו בצורה רשמית כי הן בשליטת המדינה.

המערכת (אתר) בנוייה בצורה שאיננה מסוגלת לעבוד כאשר אין JS מופעל, מערכות התרעה ציבוריות מפותחות בצורה שהם צריכות לעבוד במספר רב של מישורים.

המערכת לא ביצעה ניתוק לפי GeoIP, או מנעה גישה למי שאינו ניגש עם כתובת שמופרסמת בתוך המדינה (בדקתי בעבר כי ניתן לקבל גישה להתרעות בזמן התרעה ממדינה שאינה ידידיתית במיוחד). 

לא הוצגה אפשרות לבצע אימות צד לקוח ע"י חותמות לקוח (אם היו רוצים להגביל רק לאכלוסיה של אפליקציות מסויימות).
לא הוצג תיעוד ודרך לבצע pooling של הבקשות משרת התרעות מאבוטח לדוגמה ע"י XEP-0127.
לא הוצג תיעוד של ה API שאנשים צריכים להשתמש בו, כאשר הם מפתחים מערכת שצריכה להתממשק מול מערכת ההתרעות. כל אדם שיש לו אתר אמור להציג את ההתרעות האלה אצלו.

המערכת של המרכז לא העבירה התרעות מארגונים אחרים (לדוגמה מ ims.gov.il)
קיימת חוסר התאמה בין חותמת המשמות את TLS לבין השרתים שמספקים את השירות בפועל הרי הם יודעים למה כל כך חשוב שתהיה התאמה (ואנחנו יודעים איך מגדירים CDN משרתים מקומיים וחס שלום לא ממשהוא שיושב בחברה צד שלישית).

כי אם לא תקבלו את השגיאה הזאת ותחשבו שהאתר נפרץ (ולגמרי בצדק!)

wget https://www.oref.org.il/WarningMessages/Alert/alerts.json

--2019-01-14 18:20:03--  https://www.oref.org.il/WarningMessages/Alert/alerts.json
Resolving www.oref.org.il... 109.226.50.136, 109.226.50.139
Connecting to www.oref.org.il|109.226.50.136|:443... connected.
ERROR: cannot verify www.oref.org.il's certificate, issued by `/C=US/O=DigiCert Inc/CN=DigiCert SHA2 Secure Server CA':
  Self-signed certificate encountered.
ERROR: certificate common name `a248.e.akamai.net' doesn't match requested host name `www.oref.org.il'.
To connect to www.oref.org.il insecurely, use `--no-check-certificate'.
Unable to establish SSL connection.

את ההודעה תקבלו ב wget 1.11.4 של gnuwin אבל לא בגרסאות אחרות שהן פחות מחמירות.
את אותה הבדיקה אפשר לבצע ע"י ביצוע dig -x לכתובת אותה תקבלו מה CDN ולבצע השוואה,

ואם יש לכם מנהל רשת חשדן הוא בצדק צריך לנתק את האתר הזה (כי יש פה תקלה חמורה או התקפה חייה).

השירות מסופק מדומיין משני ציבורי (שפתוח לכל עמותה וארגון) ולא תחת הדומיין המשני שהיה אמור להיות (gov לדוגמה). יש משמעות לכל second-level domain.

היו כבר פריחת כלניות ללא הודעה מוסדרת, והיו פריחות שווא  -  זו כמובן היתה תקלה בערב שלא היתה הודעה על פריחה (למרות שהייתה התרעה קולית) או שהפריחה היתה מחוץ לטווח.

ולאחר שסיימתי את זה.

אני איש שורת הפקודה , והמערכות שאני בונה בדר"כ הם עד כמה שיותר פשוטות.
הנה דוגמה לגישה להתרעות ע"י wget :

wget --header="Referer: https://www.oref.org.il/" \
 --header="X-Requested-With: XMLHttpRequest" \
 --header="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"\
 --header="Accept: application/json, text/javascript, */*; q=0.01" \
 -qO- https://www.oref.org.il/WarningMessages/Alert/alerts.json?v=1


ב HTTP אנחנו משתמשים במה שמכונה כותרות (headers) אני פשוט הוספתי את הכותרות הבאות :
referer , X-Requsted-With, U-A, Accept.

אם רוצים לעבוד ממש לפי הספר צריך לבצע שתי בקשות , אחת בשביל לקבל את עוגיה בשם TS013a1194 והשנייה לשלוח את מה שהתקבל.
ובתוצאה נקבל :

BOM במקרה שיש דף ריק, אלוהים יודע למה אבל זה לא נורא.
בזמן התרעה נקבל מבנה json שבעבר נראה בערך כך :

{ 
"id" : "1542042267248",
"title" : "התרעות פיקוד העורף ",
"data" : [
    "מרכז הנגב 254",
    "עוטף עזה 225",
    "מרכז הנגב 255"
]
}
ה id הוא פשוט חותמת זמן מתי נשלחה (ניתן לחלק באלף ואז להשוות מול time_t רגיל).

לקח לי יותר זמן לכתוב את הפוסט הזה מאשר לזהות את התיקון הנדרש, אני בערך מנחש מדוע רצו לא לספר כמה התרעות יש בזמן אמת (לא ליצור פניקה לדוגמה).

טוב גיק או לא,אני לא יכול בלי לתת תשובה שעובדת ב systemd נכון ?כמובן שברגע ששוב יעשו תרגיל בלי לרשום זאת בצורה ברורה אנשים יקבלו התרעה על פריחה באזור או אם שוב ישנו את המבנה אז יהיה צריך לתקן את התסריט.

את התסריט אפשר להתקין על כל מערכת שמכילה bash , jq notify-send ו dbus. אפשר במקום להשתמש ב dbus להשתמש ב wall אבל אני לא אוהב את העיבוד ברירת המחדל ל wall.


קודם כל תסריט ביצוע , הטסריט מצפה שהתוכנות הבאות יהיו מותקנות : bash, jq, notify-send,dbus /usr/local/bin/windflower.sh 

#!/bin/bash

#This script will alert you when the windflower blossom around you
#Copyright (c) 2019 Boris Shtrasman
#Permission is hereby granted, free of charge, to any person obtaining a copy
#of this software and associated documentation files (the "Software"), to deal
#in the Software without restriction, including without limitation the rights
#to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
#copies of the Software, and to permit persons to whom the Software is
#furnished to do so, subject to the following conditions:

#The above copyright notice and this permission notice shall be included in all
#copies or substantial portions of the Software.

#THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
#IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
#FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
#AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
#LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
#OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
#SOFTWARE.

if [ $# -ne 1 ]; then
echo "$0 expect alert url"
echo "example:"
echo "$0 http://www.oref.org.il/WarningMessages/Alert/alerts.json";
exit 1
fi

# notify all connected users on each connected screen (full screen flash video have issues with OSD)
function notify_user()
{
     users=($(who | sed -r "s/([a-z]*)[ \t]*.*\(([^)]+)\).*/\1,\2/p" | sort|uniq))
     for i in "${users[@]}"
     do
        user=$(echo $i | cut -d',' -f1)
        screen=$(echo $i|cut -d',' -f2)
        id=$(id -u $user)
        echo $user-$screen-$id
        DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$id/bus
        sudo -u $user DISPLAY=$screen DBUS_SESSION_BUS_ADDRESS=$DBUS_SESSION_BUS_ADDRESS  \
                /usr/bin/notify-send  "$@"
      done
} 
#Get a broken json file from our windflower blossom provider
result=$( wget --header="Referer: https://www.oref.org.il/" \
               --header="X-Requested-With: XMLHttpRequest"  \
               --header="User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"\
               --header="Accept: application/json, text/javascript, */*; q=0.01" \
               -qO- https://www.oref.org.il/WarningMessages/Alert/alerts.json?v=1 $1)

if [ -e "$result" ]; then
        echo "empty"
        exit 0
fi

if [ ${#result} -lt 5 ]; then
        exit 0
fi

title=($echo $result|jq -s '.[].title')
area=$(echo $result|jq -s '.[].data')

if [ -n "$area" ]; then   
   notify_user -t 15000  "Windflower $title $date" "$area" 
fi

exit 0
נמשיך ל קובץ ה service:
cat /etc/systemd/system/windflower.service 
[Unit]
Description=Windflower bloosom

[Service]
Type=oneshot
ExecStart=/bin/bash /usr/local/bin/windflower.sh http://www.oref.org.il/WarningMessages/Alert/alerts.json

והטיימר אני הולך על חמש שניות אבל אפשר לבצע טיימר דינאמי יפה יותר מאשר זה.

בגדול נכון יהיה להשתמש ב Cache-Control שחוזר לנו מהשרת, אבל אני בחרתי ערך יפה יותר :

HTTP request sent, awaiting response... 
  HTTP/1.1 200 OK
  Content-Type: application/json
  Accept-Ranges: bytes
  ETag: W/"3ae4461aeacd41:0"
  Content-Length: 3
  Cache-Control: max-age=3
  Connection: keep-alive

הטיימר שלי נראה כך :
cat /etc/systemd/system/windflower.timer 
[Unit]
Description=Windflower bloosom
[Timer]
OnUnitActiveSec=5s
OnBootSec=100s
OnCalendar=*:*:0/5

[Install]
WantedBy=timers.target
ועכשיו נשאר רק לצפות בפריחה המדהימה.

אין תגובות:

הוסף רשומת תגובה